所以写一个函数更方便的找到尾指针
node* findrear(node* L)//找到尾指针
{
node* p = L->next;
while (p->next != L)
{
p = p->next;
}
return p;//返回尾指针
}
两个循环链表如图所示,Ta,Tb分别为两个循环链表的尾指针(上面的为链表1,下面的为链表2)。
1.先用指针p存储循环链表1的头结点,将链表1尾指针Ta指向链表2第一个结点即Ta->next=Tb->next->next,(因为Tb->next是链表2的头结点,头结点的下一个才是第一个结点b1)。
2.将第二个循环链表的头结点删除。
3.将链表2的尾结点指向链表1的头结点,构成一个新的循环链表,并返回链表1的头结点。
linklist combine(linklist L1, linklist L2)
{
linklist r1, r2;
linklist p;
r1 = findrear(L1);
r2 = findrear(L2);
p = r1->next;//p指向链表1的头结点
r1->next = r2->next->next;//删除链表2的头结点
free(r2->next);//释放链表2的头结点
r2->next = p;//链表2的尾指针指向1的头结点
return L1;//返回合并后链表的头结点
}
完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
{
int data;
struct Lnode* next;
}*linklist, node;
void Great(linklist* L, int len)//创建一个长度为n的循环链表
{
linklist r;
(*L) = (linklist)malloc(sizeof(node));
r = (*L);//尾指针
if (!(*L)) exit(0);
(*L)->next = (*L);
linklist s;
for (int i = 0; i < len; i++)
{
s = (linklist)malloc(sizeof(node));
if (!s) exit(0);
int num;
scanf("%d", &num);
s->data = num;
r->next = s;//尾插法建立,插入新的元素
r = s;//尾指针指向新插入的元素,新插入的元素为新的尾
}
s->next = (*L);
}
node* findrear(node* L)//找到尾指针
{
node* p = L->next;
while (p->next != L)
{
p = p->next;
}
return p;
}
linklist combine(linklist L1, linklist L2)
{
linklist r1, r2;
linklist p;
r1 = findrear(L1);
r2 = findrear(L2);
p = r1->next;
r1->next = r2->next->next;
free(r2->next);
r2->next = p;
return L1;
}
void print(node* L)
{
linklist p = L->next;
do
{
printf("%-5d", p->data);
p = p->next;
} while (p != L);
}
int main()
{
linklist L, L1, L2;
int len1, len2;
printf("请输入第一个循环链表的长度:");
scanf("%d", &len1);
Great(&L1, len1);
printf("请输入第二个循环链表的长度:");
scanf("%d", &len2);
Great(&L2, len2);
print(L1);
printf("循环链表1创建成功!\n");
printf("\n");
print(L2);
printf("循环链表2创建成功!\n");
printf("\n");
L = combine(L1, L2);
printf("合并后的循环链表:");
print(L);
return 0;
}
运行结果: