数据结构初阶 链表的补充

一. 主要介绍

本篇博客将会着重介绍三个接口函数

  1. 查找指定位置的链表
  2. 在指定位置插入数据
  3. 在指定位置删除数据

 二. 查找指定位置的链表

我们这里首先画出一个单链表的逻辑图

 我们要查找最好再定义一个cur来表示phead,如果我们直接用phead来查找首先是“吃相”不太好看,其次如果我们后面调用phead,phead值可能改变,所以我们最好再定义一个cur。

代码如下

SLTFind(SLTNode* phead, SLTDateType x)
{
	SLTNode* cur = phead;
	while (cur)
	{
		if (cur->date == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

操作结果如下:

三. 在指定位置插入数据(前) 

我们还是画图来看一下

我们要在pos前插入一个数据需要找到他前一个位置,我们给他前一个位置定义一个prev

我们想想看 假如说Find找不到值 我们就让它返回一个空指针

如果说要我们在空的位置插入数据 这不就是难为人嘛

直接给它断言一下,再考虑一个节点的问题和多个节点的问题

直接上代码

void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead);
	assert(pos);
	if (pos == *pphead)
	{
		SLTPushFront(pphead, x);
	}
	else
	{
		//找到pos之前的一个位置
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		SLTNode* newnode = BuySLTNode(x);
		prev->next = newnode;
		newnode->next = pos;
	}
}

演示结果

四. 在指定的位置插入数据(后) 

还是一样看图分析

这里我们在pos后面插入一个数据可以不需要head指针 我们只需要将pos指向的下一位指向新创建的数据 另外将原来的pos next赋值给新数据

代码如下

void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{
	assert(pos);
	SLTNode* newnode = BuySLTNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

我们可以发现 pos位置后面插入数据比前面插入数据简单多了

演示结果

五. 删除指定位置的数据 

还是看图

pos位置的删除其实在pos位置前插入有点类似,同样需要知道前一个位置,再让前一个位置指向pos后一个位置,释放pos即可,也是两种情况一个节点和多个节点

直接上代码

void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pos);
	assert(pphead);
	if (pos == *pphead)
	{
		free(pos);
	}
	else
	{
		//找到pos之前的一个位置
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
	}
}

演示结果

六. 删除指定位置后的数据  

还是看图

很简单直接上代码

void SLTEraseAfter(SLTNode* pos)
{
	assert(pos);
	assert(pos->next);
	SLTNode* del = pos->next;
	pos->next = pos->next->next;
	free(del);
	del = NULL;
}

 再注意一点:这里我们定义一个del来表示pos后的一个位置,预防释放错误,避免野指针问题

以上便是本文所有内容了,如有错误,请各位大佬不吝赐教,感谢留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值