数据结构 - 链表 (三)

这篇博客完成单链表的最后部分,包括单链表的查找,任意位置插入删除数据,以及动态内存的释放。

1. 单链表的查找
单链表的结构如下图所示,我们查找数据只需将链表遍历一遍是否有需要查找的数据,同时也要考虑链表初始为空的情况。
复制代码
SLTNode* STFind(SLTNode* phead, SLTDataType x)
{
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
2. 在 pos 位置 之前/之后 插入数据
在此处我们考虑两种情况,一是 pos 位置处即为头结点位置,以及 pos 位置是中间结点的位置,如下图所示:
第一种情况我们只需调用之前的头部插入数据的函数即可 ,第二种情况我们需要遍历到 pos 前一个位置,在此处插入结点即可。
复制代码
void SLInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(pphead);
	assert(pos);

	if (*pphead == pos)
	{
		SLPushFront(pphead, x); //调用头插函数
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		SLTNode* newnode = BuyLTNode(x);
		prev->next = newnode;
		newnode->next = pos;
	}
}
而则在 pos 位置之后插入数据则十分简单,直接在后面插入结点即可。代码如下:
复制代码
void SLInsertAfter(SLTNode* pos, SLTDataType x) 
{
	assert(pos);
	SLTNode* newnode = BuyLTNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}
3. 在 pos 位置/之后删除数据
在 pos 位置删除数据数据同样判断两种情况,当 pos 位置是头结点时,调用头删函数即可,否则遍历到 pos 结点位置,然后跳过 pos 结点,指向下一个结点的地址,再 free(pos) 即可。
复制代码
void SLErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead);
	assert(pos);
	if (pos == *pphead)
	{
		SLPopFront(pphead);//头部删除数据
	}
	else 
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
	}
}
删除 pos 位置之后的数据则十分简单,代码如下:
复制代码
void SLEraseAfter(SLTNode* pos)
{
	assert(pos);
	assert(pos->next);
	SLTNode* next = pos->next;
	pos->next = next->next;
	free(next);
}
4. 内存释放
free 每一个结点,phead 置空即可 ,代码如下:
复制代码
void SLDestory(SLTNode** pphead)
{
	assert(pphead);
	SLTNode* cur = *pphead;
	while (cur)
	{
		SLTNode* next = cur->next;
		free(cur);
		cur = next;
	}
	*pphead = NULL;
}
5. 结果
复制代码
SLTNode* pos = STFind(plist,3);//找 data = 3 的结点
SLInsert(&plist, pos, 100);//在 3 前插入100
SLTPrint(plist);

SLInsertAfter(pos, 200);//在 3 后插入200
SLTPrint(plist);

SLEraseAfter(pos);//删除 3 后面的 200
SLTPrint(plist);

SLErase(&plist,pos);//删除 3 
SLTPrint(plist);

SLDestory(&plist);//内存释放

相关推荐
嵌入式@秋刀鱼3 小时前
《第四章-筋骨淬炼》 C++修炼生涯笔记(基础篇)数组与函数
开发语言·数据结构·c++·笔记·算法·链表·visual studio code
嵌入式@秋刀鱼3 小时前
《第五章-心法进阶》 C++修炼生涯笔记(基础篇)指针与结构体⭐⭐⭐⭐⭐
c语言·开发语言·数据结构·c++·笔记·算法·visual studio code
泽02023 小时前
C++之list的自我实现
开发语言·数据结构·c++·算法·list
物联网嵌入式小冉学长6 小时前
2.线性表的链式存储-链表
数据结构·链表
顾小玙6 小时前
前缀和:leetcode974--和可被K整除的子数组
数据结构·算法
W说编程7 小时前
算法导论第三章:数据结构艺术与高效实现
c语言·数据结构·算法
hn小菜鸡7 小时前
LeetCode 2917.找出数组中的K-or值
数据结构·算法·leetcode
yield-bytes8 小时前
Java并发进阶系列:深度讨论高并发跳表数据结构ConcurrentSkipListMap的源代码实现(上)
数据结构
好易学·数据结构8 小时前
可视化图解算法51:寻找第K大(数组中的第K个最大的元素)
数据结构·python·算法·leetcode·力扣·牛客网·堆栈
NULL指向我10 小时前
C语言数据结构笔记5:Keil 编译器优化行为_malloc指针内存分配问题
c语言·数据结构·笔记