C语言链式存储之循环链表

目录

 

1.什么是循环链表

2.创建循环链表

3.合并循环链表

4.打印链表

5.主函数


1.什么是循环链表

    循环链表是以单链表为原型,单链表中头结点和未结点是不能直接关联的,现在循环链表让尾结点直接指向头结点,形成一个圈,实现单向循环。

2.创建循环链表

要点:<1>创建一个头结点,后面依次添加结点和单链表相同;

           <2>添加一个尾指针,使该尾指针指向链表的头结点;

           <3>使链表的尾结点的next指针指向头结点,形成循环;

//采用尾插法 
List clist()
{
	int num;                               //number of node 
	int a;                                 // 数据 
	int i =0;	
	List head = (List)malloc(sizeof(list));//创建一个头结点
	List tail; 
	tail = head;                           //使尾指针指向头结点 
	printf("input num:");
	scanf("%d",&num); 
	while(i!=num)
	{
		List node = (List)malloc(sizeof(list));
		scanf("%d",&a);
		node->data = a;
	    node->next = head;  //让这个新的尾结点指向原本尾结点的下一节点,即链表的首结点
		tail->next = node;
    	tail = node;
    	i++;
	}
	return tail; 	
}

3.合并循环链表

要点:<1>两个链表分别为p和q,使p的尾指针指向q的首结点(注意不是头结点!!!!);

           <2>使q的尾指针指向p的头结点;

           <3>释放q的头结点。

//打印循环链表
int prlist(List p)
{
	List tail;
	tail = p;
	tail = tail->next;          //指向头结点
	do
	{    
		printf("%d ",tail->next->data);
		tail = tail->next; 
	}while((tail->data)!=(p->data));
	return 0;
}

//合并两个循环链表
//将其中一个的头结点释放掉 
List comlist(List p,List q)
{
    List ptail;
	List qtail;
	List head;         //记录游离的头结点将其释放掉
    //释放q的头结点	
    head = qtail->next;               //记录q链表游离的头结点
    ptail->next = qtail->next->next;  //使p链表的尾指向q的首结点 
    qtail->next = ptail->next;        //使q的尾指向p的头 
    free(head);
	return p; 
} 

4.打印链表

//打印循环链表
int prlist(List p)
{
	List tail;
	tail = p;
	tail = tail->next;          //指向头结点
	do
	{    
		printf("%d ",tail->next->data);
		tail = tail->next; 
	}while((tail->data)!=(p->data));
	return 0;
}

5.主函数

int main()
{
	List p,q,r;    //tail是尾指针,指向循环链表的尾结点; 
	p = clist();
	prlist(p);
	q = clist();
	prlist(q);
	r=comlist(p,q);
	prlist(r);
	return 0;
		
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值