#include<stdio.h>
#include<stdlib.h>
typedef struct list
{
char data;
struct list *next;
}LinkList;
LinkList *CreateLinklist_End(int l) //尾插法创建循环单链表
{
LinkList *head,p,e;
char ch;
l=0;
head=(LinkList)malloc(sizeof(LinkList));
e=head;
ch=getchar();
while(ch!='#')
{
l=l+1;
p=(LinkList)malloc(sizeof(LinkList));
p->data=ch;
e->next=p;
e=p;
ch=getchar();
}
e->next=head;
return head;
}
LinkList *LinkList_Connect(LinkList *h1,LinkList *h2) //单循环链表的合成
{
LinkList *p1,*p2;
p1=h1->next;
p2=h2->next;
while(p1->next!=h1) //找到链表一的尾结点
p1=p1->next;
while(p2->next!=h2)
p2=p2->next;
p1->next=p2->next->next; //链表1的尾结点指向2辅助头结点的下个结点
p2->next=h1; //链表的尾结点指向链表1的辅助头结点
free(h2); //释放链表的辅助头结点
return h1;
}
void ShowLinklist(LinkList *h) //输出显示链表
{
LinkList *p;
p=h->next;
while(p!=h)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LinkList *head1,*head2;
int length1,length2; //分别记录两个循环链表的长度
length1=0;
length2=0;
printf("创建两个单循环链表:\n");
printf("第一个链表数据输入(请依次输入字符数据,‘#’号结束):\n");
head1=CreateLinklist_End(length1);
getchar();
printf("第二个链表数据输入(请依次输入字符数据,‘#’号结束):\n");
head2=CreateLinklist_End(length2);
getchar();
printf("第一个链表的数据依次为:\n");
ShowLinklist(head1);
printf("第二个链表的数据依次为:\n");
ShowLinklist(head2);
printf("第一个和第二个链表的合并输出为:\n");
head1=LinkList_Connect(head1,head2);
ShowLinklist(head1);
return 1;
}