循环链表:循环链表是一个首尾相接的链表。将单链表最后一个结点的指针域由NULL改为指向表头结点,就得到了单链形式的循环链表,并称为循环单链表。同样还可以有多重链的循环链表。
//定义结构体
typedef struct Node {
int data;
struct Node *next;
}Node,*LinkList;
//初始化循环单链表:
LinkList *InitCLinkList(LinkList *CL)//CL用来接收待初始化的循环单链表的头指针变量的地址
{
*CL = (Node *)malloc(sizeof(Node));//建立头结点
(*CL)->next = *CL;//建立空的循环单链表CL
return CL;
}
//尾插法建立单链表,并让最后一个结点的指针域指向头结点
void CreateFromTail(LinkList CL)//尾插法建立单链表
{
Node *s, *rear;
int i;
rear = (Node *)CL;
int flag = 1;
while (flag)
{
scanf("%d", &i);
if (i != -1)
{
s = (Node *)malloc(sizeof(Node));
s->data = i;
rear->next = s;
rear = s;
}
else
{
flag = 0;
}
}
rear->next = CL;
}
//循环单链表的合并算法,此算法的时间复杂度为:O(n)
LinkList merge_1(LinkList LA, LinkList LB)
{
Node *p, *q;
p = LA;
q = LB;
while (p->next != LA)
{
p = p->next;
}
while (q->next != LB)
{
q = q->next;
}
q->next = LA;
p->next = LB->next;
free(LB);
return LA;
}
//循环单链表的的合并算法,此算法的时间复杂度为:O(1)
LinkList merge_2(LinkList LC, LinkList LD)
{
Node *p;
p = LC->next;
LC->next = LD->next->next;
free(LD->next);
LD->next = p;
return LD;
}
//打印输出单链表
void print(LinkList CL)
{
Node *p;
p = CL->next;
printf("单循环链表中的元素为:");
while (p!=CL)
{
printf("%5d", p->data);
p = p->next;
}
printf("\n");
}
//验证
int main()
{
LinkList CL;
InitCLinkList(&CL);
printf("请输入数据,输入-1结束:\n");
CreateFromTail(CL);
print(CL);
system("CLS");
printf("请输入表A的数据,输入-1结束:\n");
LinkList LA;
InitCLinkList(&LA);
CreateFromTail(LA);
print(LA);
printf("请输入表B的数据,输入-1结束:\n");
LinkList LB;
InitCLinkList(&LB);
CreateFromTail(LB);
print(LB);
merge_1(LA, LB);
print(LA);
printf("merge_1的算法时间复杂度为:O(n)");
//system("CLS");
printf("\n请输入表C的数据,输入-1结束:\n");
LinkList LC;
InitCLinkList(&LC);
CreateFromTail(LC);
print(LC);
printf("请输入表D的数据,输入-1结束:\n");
LinkList LD;
InitCLinkList(&LD);
CreateFromTail(LD);
print(LD);
merge_2(LC, LD);
print(LD);
return 0;
}