循环链表

循环链表

循环链表是一个首尾相接的链表。将单链表最后一个结点的指针域由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;
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值