データ構造学習ノート (3) 線形テーブル (3)
循環リンクリスト
循環リンクリストの概念
循環リンクリストの最初のノードと最後のノードがリンクされます。循環リンク リストの最初のノードは最後のノードの前にあり、その逆も同様です。
循環リンクリストの C 言語実装
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LinkList, LNode;
LinkList *creat()
{
LinkList *head, *p1, *p2;
int i;
if ((head = (LinkList *)malloc(sizeof(LNode))) == NULL)
{
printf("Error");
exit(0);
}
p1 = p2 = head;
printf("输入创建链表的长度:");
scanf("%d, &head->data");//创建链表,带头结点,头结点数据域表示输入的个数
if(head->data==0)
{
head->next = NULL;
printf("已创带头结点的空链表");
}
else
{
printf("输入数据:\n");
for (i = 0; i < head->data;i++)
{
if((p1=(LinkList*)malloc(sizeof(LNode)))==NULL)
{
printf("Error");
exit(0);
}
scanf("%d", &p1->data);
p2->next = p1;
p2 = p1;
}
p1->next = head;
}
return (head);
}
void print(LinkList *head)
{
LinkList *p;
p = head->next;
while(p!=head)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
void main()
{
LinkList *head;
head = creat();
print(head);
}
二重リンクリスト
二重リンクリストの概念
二重リンクリストには、次のノードへのポインタだけでなく、前のノードへのポインタも存在します。このようにして、任意のノードから前のノードにアクセスしたり、次のノードやリンク リスト全体にアクセスしたりすることができます。
二重リンク リストの各ノードには、2 つのポインター フィールドと 1 つのデータ フィールドがあります。
C言語による二重リンクリストの実装
#include <stdio.h>
#include <malloc.h>
typedef struct DuLNode
{
int i;
struct DuLNode *next, *prior;
} DuLNode, *DuLinkList;
DuLNode *create_list()
{
int a[] = {
1, 2, 3, 4, 5};
int j;
DuLNode *head, *p1, *p2;
p2 = head = (DuLinkList)malloc(sizeof(DuLNode));
head->next = head->prior = NULL;
for (j = 4; j >= 0;j--)
{
p1 = (DuLinkList)malloc(sizeof(DuLNode));
p1->prior = head;
p1->next = head->next;
head->next = p1;
}
return head;
}
DuLNode *insert_list(DuLNode *head, int i, int num)
{
DuLNode *p, *q;
int j;
for (j = 1, p = head->next; j < i && p->next;j++)
{
q = p->next;
q->prior = p;
p = q;
}
q = (DuLinkList)malloc(sizeof(DuLNode));
q->i = num;
q->prior = p->prior;
q->next = p;
p->prior->next = q;
p->prior = q;
return head;
}