循环链表是一种首尾相连的链表。
和单链表的区别在于对尾结点的处理:①单链表的尾结点指向空,而循环链表的尾结点指向头结点(或第一个结点)。
②单链表的局限是只能从头开始遍历链表;而循环链表可以从表中的任意一个位置开始遍历整个链表。
③单链表一般使用头指针head操作;循环链表通常使用尾指针rear标识链表,这样在链表尾部进行处理的时候使用rear指针效率较高。
对于两个循环链表,在合并成一个循环链表时,要注意释放掉第二个循环链表的头结点,代码实现如下:
p=rear1->next;//记录第一个链表的头结点
rear1->next=rear2->next->next;//头尾相连
free(rear2->next); //释放第二个链表的头结点
rear2->next=p; //将第二个链表的尾指针指向第一个链表的头结点
另外,对循环链表的实现如下:
/*创建一个==只有==尾指针rear的===单循环===链表*/
Linklist rear=NULL;
Linklist CreateSingleLoopList()
{
int _data;
Linklist pCurrrent,head;
head=(Linklist)malloc(sizeof(Node)); //定义一个头结点
scanf("%d",&_data);
rear->data=_data;
rear->next=head;
head->next=rear;
scanf("%d",&_data);
while(_data!=-1)
{
pCurrrent=(Linklist)malloc(sizeof(Node));
pCurrrent->data=_data;
rear->next=pCurrrent;
pCurrrent->next=head;
rear=pCurrrent;
scanf("%d",&_data);
}
return rear;
}
/*取开始结点和尾结点*/
void GetRearHead(Linklist L)
{
printf("%d\n",L->data); //尾结点
printf("%d\n",L->next->next->data);//有头结点,取第一个开始的结点
}
int main()
{
rear=(Linklist)malloc(sizeof(Node));
CreateSingleLoopList();
GetRearHead(rear);
return 0;
}