用C语言实现一个链表(四)

用C语言实现一个链表(四)

在上期内容中,我们探讨了实现一个双向循环链表的准备工作以及一些功能——创建新结点,初始化头结点,尾插数据,尾删数据,遍历的代码,上期内容留下了一个判断是否存在有效数据的函数,本期内容,我们会将其补充完整并且继续讨论其他一些功能的代码实现。
链表结构

一、双向循环链表的实现(代码+分析)

1.头部插入数据

头部插入数据相对轻松,只要理解指针的链接关系即可,结合画图理解会比较轻松,如图:
结构示意图
代码如下:

void DCLLPushFront(DCLLNode* phead, DataType x)//这里只需要一级指针即可,因为改变的是结构体里面的内容,而不是改变结构
{
   
	assert(phead);
	DCLLNode* newnode = CreateDCLLNode(x);//创建一个新结点
	newnode->next = phead->next;//新结点的next指向头结点的下一个结点
	phead->next->prev = newnode;//原来头结点的下一个结点的prev指向新结点
	phead->next = newnode;//头结点的next指向新结点
	newnode->prev = phead;//新结点的prev指向头结点
}

2.判断是否存在有效数据

函数用来判断是双向循环链表是否为空。
存在有效数据就返回0(不为空),不存在有效数据就返回1(为空),代码如下:

bool DCLLisEmpty(DCLLNode* phead)
{
   
	assert(phead);
	return phead->next == phead;//如果phead的next还是phead,就说明双向循环链表只有一个头结点,并没有存入了数据的新结点
}

3.头部删除数据

结合图示理解:
在这里插入图片描述
代码如下:

void DCLLPopFront(DCLLNode* phead)
{
   
	assert(phead);
	assert(!DCLLisEmpty(phead));
	DCLLNode* front = phead->next;
	phead->next = phead->next->next;
	phead->next->prev = phead;
	free(front);
	front = NULL;
}

4.特定位置寻找

寻找就是遍历,要注意的还是循环条件的控制,代码如下:

DCLLNode* DCLLFind(DCLLNode* phead, DataType x)
{
   
	assert(phead);
	DCLLNode* cur = phead->next;//可以移动的指针指向第一个存储有效数据的结点
	while (cur != phead)//循环条件的控制和遍历相同
	{
   
		if (cur->data == x)
		{
   
			return cur;//找到了,就返回对应结点的地址
		}
		cur = cur->next;
	}
	return NULL;//找不到就返回一个空指针
}

5.特定位置插入数据

结合图示理解:
在这里插入图片描述
代码如下:

void DCLLInsert(DCLLNode* pos, DataType x)//在特定位置插入数据,需要提供对应的地址和数据
{
   
	assert(pos);
	DCLLNode* newnode = CreateDCLLNode(x);//创建新结点
	DCLLNode* prev = pos->prev;//这里是在特定位置的前面插入
	prev->next = newnode;//特定位置的前一个结点的next指向新结点
	newnode->prev = prev;//新结点的prev指向的就是特定位置的前一个结点
	newnode->next = pos;//新结点的next指向特定位置的结点
	pos->prev = newnode;//特定位置结点的prev指向新结点
}

6.特定位置删除

结合图示理解:
在这里插入图片描述
代码如下:

void DCLLErase(DCLLNode* pos)//在特定位置删除,需要提供特定位置的地址
{
   
	assert(pos);
	pos->prev->next = pos->next
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值