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;&…

Go to do list

go 语言中怎么实现分布式系统&#xff1f; 在Go语言中实现分布式系统需要考虑以下几个方面&#xff1a; 通信协议&#xff1a;在分布式系统中&#xff0c;各个节点需要通过网络进行通信。Go语言提供了丰富的网络编程库&#xff0c;如net/http、net/rpc等&#xff0c;可以方便…

Python-错误与异常处理

在 Python 中&#xff0c;错误和异常处理是编写健壮程序的重要组成部分。下面是一些关于错误和异常处理的基本知识&#xff1a; 错误&#xff08;Errors&#xff09;和异常&#xff08;Exceptions&#xff09;&#xff1a; 错误&#xff1a; 错误是程序的语法或逻辑错误&#…

【Qt】QDialog的成员函数exec()的返回值

2023年12月4日&#xff0c;周一上午 目录 返回值有哪些 怎么给QDialog的按钮设置按下后让exec()返回QDialog::Accepted或QDialog::Rejected呢&#xff1f; 返回值有哪些 QDialog::exec()函数在Qt中是用于显示对话框的一种方法&#xff0c;它会阻塞调用线程&#xff0c;直到用…

LeetCode463. Island Perimeter

文章目录 一、题目二、题解 一、题目 You are given row x col grid representing a map where grid[i][j] 1 represents land and grid[i][j] 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounde…

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

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

Inno Setup使用

功能需要&#xff0c;出一个安装包并写入相关的注册表&#xff0c;在此整理了注册表启动项相关的参考文档。多个资料整合在了一起。 [Registry] Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#M…

【开源】基于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…

RabbitMQ避免重复消费

在Java中&#xff0c;可以使用消息队列来实现消息的异步处理&#xff0c;其中常用的消息队列有 RabbitMQ、ActiveMQ、Kafka 等。 什么是幂等性&#xff1f; 幂等性是指无论操作执行多少次&#xff0c;都是得到相同的结果&#xff0c;而不会产生其他副作用。 在rabbitMQ中 什…

easyrecovery2024最新破解版激活密钥

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

算法leetcode|91. 解码方法(rust重拳出击)

文章目录 91. 解码方法&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 91. 解码方法&#xff1a; 一条包含字母 A-Z…

JS:颜色十六进制,rgb转换

重点解析&#xff1a; 1.前端开发中颜色值有三种表现形式&#xff1a;rgb&#xff0c;十六进制和rgba。rbg具体形式为rgb(r,g,b)&#xff0c;r g b的取值范围都在0-255&#xff0c;为十进制&#xff1b;rgba具体形式为rgba(r,g,b,a)&#xff0c;和rgb相比多了参数a&#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…

读书笔记:彼得·德鲁克《认识管理》第36章 以成果为中心的设计和以关系为中心的设计

一、章节内容概述 两种分权制组织(联邦分权制和模拟分权制)都围绕成果进行组织。系统制则围绕关系进行组织。在所有已知的组织设计原则中&#xff0c;联邦分权制最接近于满足组织设计的所有基本规范要求&#xff0c;但其适用性受到严格限制&#xff0c;要发挥作用就必须满足若…