链表——接口的实现(2)最详细的一集

2024-02-13 06:40

本文主要是介绍链表——接口的实现(2)最详细的一集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上期我们介绍了链表删除的接口,这期我们介绍链表的插入和打印,话不多说,开始罢>_<

前置

实现插入中需要必备的知识——内存的开辟(malloc,realloc的使用)

malloc——

插入

1.扩容

当链表中需要插入数据,也就意味着,我们需要空间的开辟,内存的扩容,我们可以把内存扩容封装到一个函数,代码如下

SLNode* SLBuyNode(SLDataType x) {SLNode* node = (SLNode*)malloc(sizeof(SLNode));node->data = x;node->next = NULL;return node;
}

首先用malloc开辟一个大小为SLNode的空间,强制类型转为为SLNode*类型,存储在node节点中,接下来将node的data赋值为x,他的next为NULL,这样便完成了链表的新节点初始化。

2.前插

在上述完成了新节点的创建后,接下来就该把这个节点放置进链表中(此处是放置在前面),我先画个图,方便理解

以下是代码实现


void SLPushFront(SLNode** pphead, SLDataType x ) {assert(pphead);SLNode* node = SLBuyNode(x);node->next = *pphead;//plist*pphead = node;
}

注意:此处要进行二级指针的传递,因为我们将要修改一个结构体指针时(上集讲到了初始化,在测试类时我们会给一个SLNode*的指针定义初始化链表)我们需要二级指针去传参,函数内部也写到了*pphead=node,如果此时不是指针类型,那么便无法进行内存地址的传值,那么则会出现形参实参的一份临时拷贝,出了函数的堆栈,那块地址的使用权便会收回,所以这里将会使用到二级指针进行传参。

讲解:在进行插入前,我们需要判断当前链表是否为空,使用assert进行判断,然后利用上面说到的SLBuynode创建节点放进node节点中,接下来改变链表的指向,更新链表头节点 (*pphead=node是更新头节点)。 

3.尾插

进行尾插,如下图所示

 代码如下:


void SLPushBack(SLNode** pphead, SLDataType x) {if (*pphead  == NULL) {*pphead = node;return;} 	SLNode* node = SLBuyNode(x);SLNode* pcur = *pphead;while (pcur->next){pcur = pcur->next; }pcur->next = node;
}

首先判断链表是否为空,若为空,则返回,接下来就初始化节点,遍历链表,找到链表的最后一个和节点,将node插入进链表,修改链表节点的指向,更新链表。

4.选择插入

在这里,我们定义要在pos点之后插入,以及插入的数据

所以函数内参数将这样写

void SLInsert(SLNode** pphead, SLNode* pos, SLDataType x)

 代码如下:


void SLInsert(SLNode** pphead, SLNode* pos, SLDataType x) {assert(*pphead);assert(pphead);assert(pos);//新节点SLNode* node = SLBuyNode(x);if ((*pphead)->next == NULL || pos == *pphead) {node->next = *pphead;*pphead = node;return;}//找pos的前一个节点SLNode* prev = *pphead;while (prev->next!=pos){prev = prev->next;}node->next = pos;prev->next = node;
}

 1.首先我们需要判断给进的链表和要插入的pos节点是否为空,接着创建节点(节点给定参数),然后我们还需要判断要插入的节点是否为空和链表是否只有一个节点,如果当链表只有一个节点或要插入的地方就是头节点,我们就直接将节点节点头插

2.除开第一种可能性,我们就可以处理要插入的节点在链表之中的可能性了,设置prev节点来依次遍历链表,找到pos,插入数据,修改指向,便完成了链表的插入。

打印

链表的打印也是很简单的,依次遍历打印即可,上代码

void SLPrint(SLNode* Phead) {SLNode* pcur = Phead;while (pcur!=NULL){printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}

到此我们便完成了链表插入和打印的步骤,感谢阅读,文章中有不对的或者有疑惑欢迎在评论区留言

这篇关于链表——接口的实现(2)最详细的一集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704768

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-