C语言实现---双向循环链表

循环链表

循环单链表是在在单链表的基础上,用最后的一个结点的指针域指向头结点形成的。因此它在逻辑上是一个环形结构。
双向是一个节点有前驱和后驱。

结构定义

typedef struct List
{
	int data;
	struct List* prior;
	struct List* nxet;
}CircularList;

创建头节点

CircularList* InitList()
{
	CircularList* head;
	head = (CircularList*)malloc(sizeof(CircularList));
	head->nxet = head;
	head->prior = NULL;
	return head;
}

向链表插入数据(尾插法)

void ListInsert(CircularList* head, int data)
{
	CircularList* p,*h;
	h = head;
	p = (CircularList*)malloc(sizeof(CircularList));
	while (h->nxet != head)
	{
		h = h->nxet;
	}
	p->data = data;
	h->nxet = p;
	p->nxet = head;					//最后一个指向头节点
	p->prior = h;					//
	head->prior = p;				//头节点前驱指向最后一个节点
}

打印数据(查看是否正确)

int Print(CircularList* head, int way)
{
	CircularList* Hp, * Pp;
	Hp = head->nxet;
	Pp = head->prior;
	if (head->nxet == head)
		return 0;

	if (way == 0)							//顺序打印
	{
		while (Hp != head)
		{
			printf("%d\n", Hp->data);		
			Hp = Hp->nxet;
		}
	}
	if (way == 1)							//倒序打印
	{
		while (Pp != head)
		{
			printf("%d\n", Pp->data);
			Pp = Pp->prior;
		}
	}
}

顺序打印是测试后驱,倒序是测试前驱。
测试循环,即把if中

Hp != head

改为:

Hp != NULL

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值