循环链表
循环链表是一个首尾相接的链表。将单链表最后一个结点的指针域由NULL改为指向表头结点,就得到了单链形式的循环链表,称为循环链表。
循环链表的合并算法(1)
typedef int ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node * next;
}Node, *LinkList; /* LinkList为结构指针类型*/
void create_clinklist(LinkList l)/*头插法创建循环链表*/
{
int num;
Node *p;
l->data=-1;
l->next=l;
printf("请输入循环链表的元素 (以-1结束):\n");
scanf("%d",&num);
while(num != -1)
{
p=(Node*)malloc(sizeof(struct Node));
p->data=num;
p->next=l->next;
l->next=p;
scanf("%d",&num);
}
}
LinkList merge_1(LinkList LA,LinkList LB)
{ /*此算法将两个采用头指针的循环单链表的首尾连接起来*/
Node *p, *q;
p=LA;
q=LB;
while (p->next!=LA) p=p->next; /*找到表LA的表尾,用p指向它*/
while (q->next!=LB) q=q->next; /*找到表LB的表尾,用q指向它*/
q->next=LA; /*修改表LB 的尾指针,使之指向表LA 的头结点*/
p->next=LB->next; /*修改表LA的尾指针,使之指向表LB 中的第一个结点*/
free(LB);
return(LA);
}
void main()
{
LinkList la,lb,lc;
Node *p;
printf("建立循环链表A,请输入数据!:\n");
la=(Node*)malloc(sizeof(struct Node));
create_clinklist(la);
p = la->next;
while(p!=la)
{
printf("%d\n",p->data);
p=p->next;
}
printf("建立循环链表B,请输入数据!:\n");
lb=(Node*)malloc(sizeof(struct Node));
create_clinklist(lb);
p = lb->next;
while(p!=lb)
{
printf("%d\n",p->data);
p=p->next;
}
lc=merge_1(la,lb);
printf("合并后的循环链表为:\n");
p = lc->next;
while(p!=lc)
{
printf("%d\n",p->data);
p=p->next;
}
}
循环链表的合并算法(2)
LinkList crt_linklist()/*创建尾指针表示的循环链表*/
{
LinkList l;
int num;
Node *p;
l=(Node*)malloc(sizeof(struct Node));
l->data=-1;
l->next=l;
printf("请输入循环链表的元素 (以-1结束):\n");
scanf("%d",&num);
while(num != -1)
{
p=(Node*)malloc(sizeof(struct Node));
p->data=num;
p->next=l->next;
l->next=p;
scanf("%d",&num);
}
p=l;
while(p->next!=l)
{
p=p->next;
}
return p;
}
LinkList merge_2(LinkList RA,LinkList RB)
{ /*此算法将两个采用尾指针的循环链表首尾连接起来*/
Node *p;
p=RA->next; /*保存链表RA的头结点地址*/
RA->next=RB->next->next;/*链表RB的开始结点链到链表RA的终端结点之后*/
free(RB->next);/*释放链表RB的头结点,释放的是指针指向的那块内存*/
RB->next=p;/*链表RA的头结点链到链表RB的终端结点之后*/
return RB;/*返回新循环链表的尾指针*/
}
void main()
{
LinkList la,lb,lc;
Node *p;
printf("建立循环链表A,请输入数据!:\n");
la=crt_linklist();
p = la->next->next;
while(p!=la->next)
{
printf("%d\n",p->data);
p=p->next;
}
printf("建立循环链表B,请输入数据!:\n");
lb=crt_linklist();
p = lb->next->next;
while(p!=lb->next)
{
printf("%d\n",p->data);
p=p->next;
}
lc=merge_2(la,lb);
printf("合并后的循环链表为:\n");
p = lc->next->next;
while(p!=lc->next)
{
printf("%d\n",p->data);
p=p->next;
}
}