本篇文章也主要介绍一下循环链表,不经常使用,但也是必须掌握的,无论是实验还是考试。
代码实现
//循环链表的建立
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
typedef struct Node
{
int data;
struct Node* next;
}RNode;
//初始化结点
RNode* initnode()
{
RNode* node;
node = (struct Node*)malloc(sizeof(struct Node));
node->data = 0;
node->next = NULL;
return node;
}
//创立一个只有头结点的双向链表
RNode* create_link_list()
{
RNode* head;
head = initnode();
return head;
}
//本次采用前插法建立链表
void front_insert(RNode *head, int x)
{
RNode* p = initnode(); //移动的指针
p->data = x;
if (head->next == NULL)
{
head->next = p;
p->next = head; //包裹起来
}
else
{
p->next = head->next;
head->next = p;
}
}
//判断循环链表中的尾结点是否为:head
int isNull(RNode *head)
{
RNode* p = head; //移动的指针
while (p->next != head)
{
p = p->next; //此时指针在移动到尾结点中, 这也是循环链表的一个弊端,只能找到后继,不能直接找前驱,每次找前驱的时候都必须通过头结点从头开始
}
//此时已经走向尾部结点了,因为循环结束,并没有报错
if (p->next == head)
return 1;
return 0;
}
void display(RNode* p)
{
RNode* head = p;
p = p->next; //去掉头结点的值
while (p->next != head)
{
printf("%c->", p->data);
p = p->next;
}
printf("%c", p->data);
}
int main()
{
RNode* link_list;
link_list = create_link_list();
for (char i = 'F'; i >= 'A'; i--)
{
front_insert(link_list, i);
}
display(link_list);
printf("\n是否为循环链表(1是0不是): %d\n", isNull(link_list));
system("pause");
return 0;
}
结果:
A->B->C->D->E->F
是否为循环链表(1是0不是): 1
总结
循环链表:与单链表的区别在于尾结点的指针域为NULL,而循环链表的指针域却是指向第一个结点的, 在进行遍历的条件也不一样,单链表是最后一个指针指向NULL结束,而循环链表是当最后一个指针的指针域为第一个结点为条件。 作用:与单链表基本相差不大