目录
1.什么是循环链表
循环链表是以单链表为原型,单链表中头结点和未结点是不能直接关联的,现在循环链表让尾结点直接指向头结点,形成一个圈,实现单向循环。
2.创建循环链表
要点:<1>创建一个头结点,后面依次添加结点和单链表相同;
<2>添加一个尾指针,使该尾指针指向链表的头结点;
<3>使链表的尾结点的next指针指向头结点,形成循环;
//采用尾插法
List clist()
{
int num; //number of node
int a; // 数据
int i =0;
List head = (List)malloc(sizeof(list));//创建一个头结点
List tail;
tail = head; //使尾指针指向头结点
printf("input num:");
scanf("%d",&num);
while(i!=num)
{
List node = (List)malloc(sizeof(list));
scanf("%d",&a);
node->data = a;
node->next = head; //让这个新的尾结点指向原本尾结点的下一节点,即链表的首结点
tail->next = node;
tail = node;
i++;
}
return tail;
}
3.合并循环链表
要点:<1>两个链表分别为p和q,使p的尾指针指向q的首结点(注意不是头结点!!!!);
<2>使q的尾指针指向p的头结点;
<3>释放q的头结点。
//打印循环链表
int prlist(List p)
{
List tail;
tail = p;
tail = tail->next; //指向头结点
do
{
printf("%d ",tail->next->data);
tail = tail->next;
}while((tail->data)!=(p->data));
return 0;
}
//合并两个循环链表
//将其中一个的头结点释放掉
List comlist(List p,List q)
{
List ptail;
List qtail;
List head; //记录游离的头结点将其释放掉
//释放q的头结点
head = qtail->next; //记录q链表游离的头结点
ptail->next = qtail->next->next; //使p链表的尾指向q的首结点
qtail->next = ptail->next; //使q的尾指向p的头
free(head);
return p;
}
4.打印链表
//打印循环链表
int prlist(List p)
{
List tail;
tail = p;
tail = tail->next; //指向头结点
do
{
printf("%d ",tail->next->data);
tail = tail->next;
}while((tail->data)!=(p->data));
return 0;
}
5.主函数
int main()
{
List p,q,r; //tail是尾指针,指向循环链表的尾结点;
p = clist();
prlist(p);
q = clist();
prlist(q);
r=comlist(p,q);
prlist(r);
return 0;
}