P8 删除链表指定节点

前言
                                     

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》✨✨✨ 

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》✨✨✨

📝推荐专栏3: ​​​​​​《 链表_@ChenPi的博客-CSDN博客》 ✨✨✨
🍉本篇简介  :  链表数据插入之尾插法

✨ 只有我努力了 才有机会接触成功✨

链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

作为有强大功能的链表,对他的操作当然有许多,比如:

  1. 链表的创建
  2. 链表的链表的遍历打印数据
  3. 链表里面的结构体数据的修改
  4. 链表节点的删除
  5. 链表插入新节点
  6. 链表的数据排序
  7. 链表的反序
  8. 清空链表的元素
  9. 求链表的长度等

在前面几章,我们学习了 

  1. 链表的创建
  2. 链表的链表的遍历打印数据
  3. 链表里面的结构体数据的修改
  4. 求链表的长度等
  5. 还有链表结尾插入数据节点,非指定节点
  6. 链表指定节点后方插入数据
  7. 链表头插入新节点以及头插法创建链表

 对链表的操作我们还差链表指定节点的删除,反序以及清空链表

这章我们学习链表指定节点删除

01 链表删除指定节点

首先,我们先确定函数的大致操作

我们定义一个函数名为deleteHeadLinkNode

有两参数,参数1为链表的头节点,参数2为一个整形变量的索引NodeIndex

索引值则是要删除的节点,如索引值等于1,择删除第一个节点

返回值则是一个结构体指针,返回值为链表头的地址

struct Link * deleteHeadLinkNode(struct Link *head,int NodeIndex)
{}

函数体大致这样,首先,我们要判断索引值是否越界

/*获取链表的节点数*/
int GetLinkNum(struct Link *head)
{struct Link *prev = head;int count = 0;while (prev != NULL){count++;prev = prev->next;}return count;
}struct Link * deleteHeadLinkNode(struct Link *head,int NodeIndex)
{struct Link *prev = head;   //保存头节点的地址if(NodeIndex > GetLinkNum(prev)||(NodeIndex<0))   //判断是否越界{printf("ERROR: Link index out of range");return NULL;}
}

上面这段代码为检测索引值有没有越界,越界的意思是,比如我链表的长度为5,当传进来的索引值为7,那链表总共就5个节点,这么删除第七节点嘛,所以越界了

其实其中的每一部分都可以写成一个函数了,这样模块话,可以减少很多功夫,我们下一章在讲模块化的问题把

现在我们看上面图的第二个红框框,这部分就是删除链表的头节点了,我们分析下代码

当索引值为1的时候,我们让链表的头节点等于链表头的下一个节点就可以

然后释放prev

prev在第一个红框里已经被指向头节点

第三个红框框则是本章的重点了,因为我们创建链表是在堆中创建的,属于是动态创建的链表

所以我们释放要删除的节点要格外小心

不然就很容易出BUG

首先我们要定义一个结构体的指针prior,指向用于保存前节点的地址,然后就是遍历

定义整形变量记录目前遍历到第几节点,如果找到了目标节点,判断是否为链表尾

如果是,就让保存的前节点的next等于NULL就行,然后释放prev

正常节点也如此

我们测试一下,我们调用函数,删除第二节点,我们看下打印,从 4 2 5 3变为4 5 3了,第二节点已经被释放 

测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct Link
{int data;struct Link *next;
};/*打印链表数据*/
void PrintLink(struct Link *head)
{struct Link *prev = head;while (NULL != prev) {printf("%d  ", prev->data);prev = prev->next;}printf("\n");
}/*获取链表的节点数*/
int GetLinkNum(struct Link *head)
{struct Link *prev = head;int count = 0;while (prev != NULL){count++;prev = prev->next;}return count;
}struct Link *getHead(int data)
{struct Link* head = (struct Link*)malloc(sizeof(struct Link));head->data = data;head->next = NULL;return head;
}/* 链表头插入数据,不指定位置*/
struct Link* frontInsertDataLink(struct Link *head, int data)
{struct Link *prev = head;struct Link *newLink = (struct Link *)malloc(sizeof(struct Link));newLink->data = data;newLink->next = prev;return newLink;
}struct Link *frontInsertNodeDataLink(struct Link *head,int NodeIndex,int data)
{struct Link *prev = head;int cnt = 1;if(NodeIndex > GetLinkNum(prev)||(NodeIndex<0)){printf("ERROR: Link index out of range");return NULL;}else if (NodeIndex == 1){prev = frontInsertDataLink(prev,data);return prev;}while (NULL != prev->next){if(cnt == NodeIndex-1){struct Link *newLink = (struct Link *)malloc(sizeof(struct Link));newLink->data = data;newLink->next = prev->next;prev->next = newLink;return head;}cnt++;prev = prev->next;}return NULL;
}struct Link * deleteHeadLinkNode(struct Link *head,int NodeIndex)
{struct Link *prev = head;   //保存头节点的地址int cnt = 1;if(NodeIndex > GetLinkNum(prev)||(NodeIndex<0))   //判断是否越界{printf("ERROR: Link index out of range");return NULL;}if(1 == NodeIndex)   //如果要删除头节点{head = head->next;free(prev);return head;}struct Link *prior = NULL;   //遍历时用来保留前一个节点的状态while (NULL != prev)   //判断是不是最后一个节点{prior = prev;//用来保留前一个节点的状态prev = prev->next;   //走向下一个节点,也就是循环增量if(cnt == NodeIndex-1)  //找到需要删除的节点{if(NULL == prev->next)    //1.如果找到的是尾节点{prior->next = NULL;       //原来尾节点的前一个为节点变成了新尾节点free(prev);        //释放原来尾节点的内存return head;}else    //如果找到的是普通节点{prior->next = prev->next;   //要删除的节点的前一个节点和后一个节点相连free(prev);return head;}}cnt++;}return NULL;   //没找到对应节点,操作失败,返回NULL
}int main()
{struct Link *head = getHead(3);head = frontInsertDataLink(head, 5); head = frontInsertDataLink(head, 2); PrintLink(head);head = frontInsertNodeDataLink(head, 1,4);PrintLink(head);head = deleteHeadLinkNode(head,2);PrintLink(head);return 0;
}

我们下一期写一下 清空链表吧

🌺对您有帮助的话记得点赞加关注


🌺如果有说的不对的欢迎指正

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

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

相关文章

【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

基于Springboot的秒杀系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的秒杀系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

【开源】基于Vue和SpringBoot的音乐偏好度推荐系统

项目编号&#xff1a; S 012 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S012&#xff0c;文末获取源码。} 项目编号&#xff1a;S012&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1…

easyrecovery2024最新破解版激活密钥

平时很多人都会把自己工作时&#xff0c;或者生活中的数据存储在我们的电脑上&#xff0c;很多时候&#xff0c;由于我们的误操作或者是其它某些问题&#xff0c;很容易就会误删除一些文件数据了&#xff0c;尤其是一些电脑出现故障&#xff0c;总是会导致数据丢失&#xff0c;…

linux 内核regulator

问题 在sys文件系统下没有生成cpu 调频的相关节点。 日志对比 [ 3.588745] cpu cpu4: Looking up cpu-supply from device tree [ 3.588753] cpu cpu4: Failed to get reg [ 3.588791] cpu cpu4: Looking up cpu-supply from device tree [ 3.588808] Failed to i…

智能优化算法应用:基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.和声算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

外贸建站是WP还是CMS?海洋建站教程指南?

外贸建站选WP还是CMS系统&#xff1f;外贸企业网站建站怎么做&#xff1f; 随着全球化的不断发展&#xff0c;越来越多的企业开始拓展海外市场&#xff0c;外贸建站成为了这些企业的必备项目。然而&#xff0c;选择使用哪种建站系统却是一个让人头疼的问题。那么&#xff0c;海…

ElementUI+vue+nodejs培训学校课程预约网站的设计与开发

该系统将采用B/S结构模式&#xff0c;前端部分主要使用html、css、JavaScript等技术&#xff0c;使用Vue和ElementUI框架搭建前端页面&#xff0c;后端部分将使用Nodejs来搭建服务器&#xff0c;并使用MySQL建立后台数据系统&#xff0c;通过axios完成前后端的交互&#xff0c;…

oops-framework框架 之 界面管理(三)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 注&#xff1a; 作者dgflash的oops-framework框架QQ群&#xff1a; 628575875 回顾 在上文中主要通过oops-game-kit大家了一个新的模版项目&#xff0c; 主要注意项是resources目录下的两个文…

如何在安卓Termux中使用SFTP文件传输并结合内网穿透工具实现远程传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

Jmeter的安装配置,性能测试编写

1、jmeter介绍 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 运行环境为Windows 10系统&#xff0c…

AI创作ChatGPT网站系统源码保姆级搭建部署教程+支持GPT-4图片对话能力

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

数据结构与算法-动态查找表

查找 &#x1f388;3动态查找表&#x1f52d;3.1二叉排序树&#x1f3c6;3.1.1二叉排序树的类定义&#x1f3c6;3.1.2二叉排序树的插入和生成&#x1f3c6;3.1.3二叉树的查找&#x1f3c6;3.1.4二叉排序树的删除 &#x1f52d;3.2平衡二叉树&#x1f3c6;3.2.1平衡二叉树的调整…

基于粒子群算法思想的电动汽车充放电策略-V2G模型-程序代码!

电动汽车充放电对电网的安全稳定带来影响&#xff0c;合理规划电动汽车充放电时间和策略是目前的研究热点。本程序仿真了汽车有序充电和无需充电两种案例&#xff0c;利用电动汽车合理消纳新能源电量&#xff0c;利用粒子群算法思想来求解模型&#xff0c;程序中案例丰富&#…

智能锁-SI522TORC522方案资料

南京中科微这款SI522目前完全PinTOPin兼容的NXP&#xff1a;RC522、CV520 复旦微&#xff1a;FM17520、FM17522/FM17550 瑞盟&#xff1a;MS520、MS522 国民技术:NZ3801、NZ3802 SI522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对&quo…

2.1 Linux C 编程

一、Hello World 1、在用户根目录下创建一个C_Program&#xff0c;并在这里面创建3.1文件夹来保存Hellow World程序&#xff1b; 2、安装最新版nvim ①sudo apt-get install ninja-build gettext cmake unzip curl ②sudo apt install lua5.1 ③git clone https://github.…

HarmonyOS 振动效果开发指导

Vibrator 开发概述 振动器模块服务最大化开放硬工最新马达器件能力&#xff0c;通过拓展原生马达服务实现振动与交互融合设计&#xff0c;打造细腻精致的一体化振动体验和差异化体验&#xff0c;提升用户交互效率和易用性、提升用户体验、增强品牌竞争力。 运作机制 Vibrato…

内衣专用洗衣机怎么样?好用又便宜的迷你洗衣机推荐

迷你洗衣机作为一种小型便捷的家用必备洗涤设备&#xff0c;一直都受到越来越多家庭的青睐。一台迷你洗衣机可以帮助我们解决很多麻烦&#xff0c;节省我们的很多时间。对于不少在外工作的人&#xff0c;往往是一个人住&#xff0c;买一台大型的洗衣机或许有点浪费资源&#xf…

JWT令牌的获取与过滤器Filter的使用

JWT&#xff0c;全称JSON Web Token&#xff08;JSON Web令牌&#xff09;&#xff0c;是一个开放标准 (rfc7519)。它定义了一种紧凑的、自包含的方式&#xff0c;以JSON对象的形式安全地在各方之间传输信息。这种信息可以被验证和信任&#xff0c;因为它是通过数字签名实现的。…

专升本期间部分C语言程序整理

说明 这些程序是我在专升本期间在CSDN上上传的作业、练习等&#xff0c;仅为学习备考的一小部分程序&#xff0c;整理成一篇文章&#xff0c;方便专升本的学弟学妹参考。 时间&#xff1a;2021年~2022年专升本期间 字符串题 输入字符串提取 数字字符 并 求和 &#xff08;4处…