单链表--续(C语言详细版)

2.6 在指定位置之前插入数据

// 在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);

分为两种情况:1. 插入的数据在链表中间;2. 插入的数据在链表的前面。

// 在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{// 链表不能为空 *pphead != NULLassert(pphead && *pphead);assert(pos);// 申请新的节点SLTNode* newNode = SLTBuyNode(x);// 若pos == *pphead,说明是头插,调用头插函数接口if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}newNode->next = pos;prev->next = newNode;}
}

测试程序:测试头节点之前插入

void SListTest02()
{SLTNode* plist = NULL;// 测试尾插SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);// 测试在指定位置之前插入数据// 先找下标,再插入//SLTNode* find = SLTFind(plist, 3);SLTNode* find = SLTFind(plist, 1);    // 测试头节点之前插入//SLTNode* find = SLTFind(plist, 4);SLTInsert(&plist, find, 16);SLTPrint(plist);
}int main()
{SListTest02();return 0;
}

运行结果:

测试程序:测试链表中间插入

void SListTest02()
{SLTNode* plist = NULL;// 测试尾插SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);// 测试在指定位置之前插入数据// 先找下标,再插入SLTNode* find = SLTFind(plist, 3);    // 测试头节点之前插入//SLTNode* find = SLTFind(plist, 1);//SLTNode* find = SLTFind(plist, 4);SLTInsert(&plist, find, 16);SLTPrint(plist);
}int main()
{SListTest02();return 0;
}

运行结果:

2.7 在指定位置之后插入数据

// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);

// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x) // 不需要给头节点
{assert(pos);// 申请新的节点SLTNode* newNode = SLTBuyNode(x);newNode->next = pos->next;pos->next = newNode;
}

测试程序:

void SListTest02()
{SLTNode* plist = NULL;// 测试尾插SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);// 测试在指定位置之后插入数据SLTNode* find = SLTFind(plist, 1);SLTInsertAfter(find, 24);SLTPrint(plist);
}int main()
{SListTest02();return 0;
}

运行结果:

2.8 删除pos节点

// 删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);

// 删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{// 链表不能为空 *pphead != NULLassert(pphead && *pphead);assert(pos);// pos是头节点if (pos == *pphead){这里就是头删接口函数//SLTNode* next = (*pphead)->next;//free(*pphead);//*pphead = next;SLTPopFront(pphead);}else{// pos不是头节点SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}
}

测试程序:

void SListTest02()
{SLTNode* plist = NULL;// 测试尾插SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);// 测试删除pos节点//SLTNode* find = SLTFind(plist, 1);//SLTNode* find = SLTFind(plist, 4);SLTNode* find = SLTFind(plist, 3);SLTErase(&plist, find);SLTPrint(plist);
}int main()
{SListTest02();return 0;
}

运行结果:

2.9 删除pos之后的节点

// 删除pos之后的节点
void SLTEraseAfter(SLTNode* pos);

// 删除pos之后的节点
void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);// 先存要删除的节点地址SLTNode* del = pos->next;pos->next = pos->next->next;//pos->next = del->next;free(del);del = NULL;
}

测试程序:测试中间的节点

void SListTest02()
{SLTNode* plist = NULL;// 测试尾插SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);// 测试删除pos之后的节点//SLTNode* find = SLTFind(plist, 3);SLTNode* find = SLTFind(plist, 1);    // 中间的节点SLTEraseAfter(find);SLTPrint(plist);
}int main()
{SListTest02();return 0;
}

运行结果:

测试程序:测试删除的是最后一个节点

void SListTest02()
{SLTNode* plist = NULL;// 测试尾插SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);// 测试删除pos之后的节点SLTNode* find = SLTFind(plist, 3);    // 删除的是最后一个节点//SLTNode* find = SLTFind(plist, 1);SLTEraseAfter(find);SLTPrint(plist);
}int main()
{SListTest02();return 0;
}

运行结果:

2.10 销毁链表

// 销毁链表
void SListDestroy(SLTNode** pphead);

// 销毁链表
void SListDestroy(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

测试程序:

void SListTest02()
{SLTNode* plist = NULL;// 测试尾插SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPrint(plist);// 测试删除pos之后的节点SLTNode* find = SLTFind(plist, 3);    // 删除的是最后一个节点//SLTNode* find = SLTFind(plist, 1);SLTEraseAfter(find);SLTPrint(plist);// 销毁链表SListDestroy(&plist);SLTPrint(plist);
}int main()
{SListTest02();return 0;
}

调试结果:节点全部释放

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画何以突飞猛进? 从历史到技术突破, 一文读懂火爆的AI绘画发展史

前言 自从前段时间偶然间被当下AI绘画的水平震住之后(超越一切的AI作画神器,和它创作的234个盔甲美女未来战士) ,作者深感当今AI绘画的飞速进展或许已远超所有人的预期。 而这里的前因后果,包括AI绘画的历史&#xff…

十九.升职加薪系列-JVM优化-解决JVM性能瓶颈的JIT即时编译器

前言 在很多年以前,做C或者C的程序员经常说Java语言的运行速度不如C或C,Java运行速度慢主要是因为它是解释执行的,而C或C是编译执行的,解释执行需要通过JVM虚拟机将字节码实时翻译成机器码(边翻译边执行)&…

Rust 版本升级:rustup update stable 报错

Rust 版本升级 rustup update stable 报错 一、报错内容 error: could not download file from ‘https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256’ to ‘/Users/xxx/.rustup/tmp/rv6vdfu3eupwo64m_file’: failed to make network request: error sendi…

【实战场景】@Transactional中使用for update的注意点

【实战场景】Transactional中使用for update的注意点 开篇词:干货篇:知识回顾注意点1.锁的范围和粒度:2.事务的隔离级别:3.死锁:4.性能影响:5.事务的边界:6.异常处理:7. 数据库和存储…

【漏洞复现】网神 SecGate 3600 防火墙 sys_export_conf_local_save 任意文件读取

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

javaweb学习day5--《HTML篇》Springboot的模块创建、HTML的相关知识点详解

一、前言 从今天开始,就要启动后端的学习了,Springboot会贯穿到底,一定要跟着小编严谨的去搭建Springboot环境,依赖添加的过程可能需要2分钟左右,读者们要耐心等待一下,搭建好Springboot之后才算正式的开始…

算力革命:弹性租赁,解锁无限可能

华为创始人任正非曾在一场程序设计竞赛中说道,我们即将进入第四次工业革命,基础就是大算力。事实上,随着5G、人工智能等信息技术的迅猛发展,算力需求持续增长,但高昂的成本和快速的技术迭代让许多中小企业和个人开发者…

Covalent Network(CXT)通过社区投票将代币迁移并更名为 CXT,以推动人工智能更深层次的创新

专注于人工智能和 Web3 的模块化数据基础设施 Covalent Network(CXT)宣布,其治理提案已通过社区投票并顺利实施,即将原生代币 CQT 迁移为新的 CXT 代币,并部署至新的合约。这一关键性转变标志着 Covalent Network&…

springboot文达办公物资管理系统-计算机毕业设计源码51191

摘要 本文介绍了一种名为"文达办公物资管理系统"的基于JAVA语言、基于Springboot框架和MYSQL数据库开发的管理系统。该系统主要分为管理员和员工用户两个角色,以满足不同用户的需求。 对于管理员用户,系统提供了仪器设备管理、设备借用管理、设…

【大数据技术】换新电脑了,如何快速迁移MySQL到新电脑上(含程序+数据),这样既快速又高效,省去了“各种安装+各种配置+各种迁移数据”带来的麻烦和时间

【大数据技术】换新电脑了,如何快速迁移MySQL到新电脑上(含程序数据 背景步骤总结 背景 很久没有写博文了哦,最近我换了新的笔记本,于是需要在新笔记本电脑上搭建MySQL环境,因为我原电脑上是安装的MySQL解压版,故我想偷偷懒&…

可理解性评估:使用Google Gemini优化语音识别的意义保留

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

实验1 —— 安全策略的练习

实验拓扑图 实验要求 1.DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问; 2.生产区不允许访问互联网,办公区和游客区允许访问互联网 3.办公区…

动手学Avalonia:基于硅基流动构建一个文生图应用(一)

文生图 文生图,全称“文字生成图像”(Text-to-Image),是一种AI技术,能够根据给定的文本描述生成相应的图像。这种技术利用深度学习模型,如生成对抗网络(GANs)或变换器(T…

【Mac】Charles for Mac(HTTP协议抓包工具)及同类型软件介绍

软件介绍 Charles for Mac 是一款功能强大的网络调试工具,主要用于HTTP代理/HTTP监视器。以下是它的一些主要特点和功能: 1.HTTP代理:Charles 可以作为HTTP代理服务器,允许你查看客户端和服务器之间的所有HTTP和SSL/TLS通信。 …

金航标kinghelm宋仕强在介绍自己公司时说

金航标kinghelm宋仕强在介绍自己公司时说,金航标成立于2007年,成立地点在华强北雷圳大厦803室,后搬到华强北广业大厦24楼CD室,后搬迁到龙华展滔科技大厦C座C809和C817室,现在的办公地址为龙岗区坂田街道百瑞达大厦&…

PageDTO<T>,PageQuery,BeanUtils,CollUtils的封装

一、PageDTO<T> import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.annotation.JsonIgnore; import com.tianji.common.utils.BeanUtils; import com.tianji.common.utils.CollUtils; import com.tianji.common.utils.…

C#中的MD5摘要算法与哈希算法

文章目录 一、哈希算法基础二、MD5 算法原理三、MD5摘要算法四、哈希算法五、C#实现示例MD5算法示例哈希算法示例字符串MD5值对比 六、总结 一、哈希算法基础 哈希算法是一种单向密码体制&#xff0c;它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的&#xff0…

IDEA中配置代理,解决Codearts Snap登陆不了的问题

问题描述&#xff1a;在mac电脑中的idea中安装了华为的codearts snap插件&#xff0c;一直登录不了&#xff0c;账号是没问题的&#xff0c;后来我怀疑是我的代理有问题&#xff0c;找到IDEA中的代理设置先是有这个问题“You have JVM property "https.proxyHost" se…

千呼新零售2.0分销商城视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

Android初学者书籍推荐

书单 1.《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程&#xff08;Android Studio 第2版&#xff09;》 从学安卓到用安…