单链表之删除节点

2023-05-16

1.删除节点的步骤
(1)找到要删除的这个节点:通过遍历来查找节点,从头指针+头节点开始,顺着链表依次将各个节点拿出来,按照一定的方法比对,找到我们要删除的那个节点。
(2)删除这个节点
(2.1)如果不是尾节点:首先把待删除节点的前一个节点的pNext指向待删除节点的后一个节点的首地址,然后再将摘出来这个节点free掉。
(2.2)如果这个节点是尾节点,首先把待删除这个节点的前一个节点的pNext指针指向NULL,然后再将摘出来这个节点free掉。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//构建链表节点
struct node
{
        int data;       //有效数据
        struct node *pNext;     //指向下一个节点的指针

};


//函数功能,创建链表节点
//返回值:指针,指向我们本函数新创建的一个节点的首地址
struct node *creat_node(int data)
{

        //创建一个链表节点
        struct node *p = (struct node *)malloc(sizeof(struct node));
        if(NULL == p)
        {
                printf("malloc error\n");
                return NULL;
        }


        //清理申请到的堆内存
        // void bzero(void *s, size_t n);
        bzero(p,sizeof(struct node));

        //填充节点
        p->data = data;
        p->pNext = NULL;       //将来要指向下一个节点的首地址

        return p;
}

//重头部加入新节点
void insert_head(struct node *pH,struct node *new)
{

/*      方法一:
         
        //第一步:新节点的pNext指向第一个节点
        new->pNext = pH->pNext;
        //第二部:头结点的pNext指向新节点
        pH->pNext = new;
        //第三部:头结点的计数加1
        pH->data += 1;
*/
        //方法二:

        //先保存第一个节点
        struct node *p1 = pH->pNext;
        //让头结点的pNext指向新节点
        pH->pNext = new;
        //新节点的pNext指向保存好的第一个节点
        new->pNext = p1;
        //头结点计数加1
        pH->data += 1;
}

/有头节点遍历
void bianli2(struct node *pH)
{
        struct node *p = pH;  //头指针后面是头节点这样初始化下面会打印头结点的数据

        printf("开始遍历==================\n");

        while(NULL != p->pNext)
        {
                p = p->pNext;
                printf("node data = %d\n",p->data);
        }

        printf("遍历完成==================\n");
}

//从链表pH中删除节点,待删除节点的数据区的值等于data
//返回值:当找到节点并成功删除返回0,未找到这个节点返回-1
int delete_node(struct node *pH,int data)
{
        struct node *p = pH;    //头指针后面的头节点(用来指向当前节点)
        struct node *pp = NULL;         //用来指向当前节点的前一个节点

        while(NULL != p->pNext) //判断是不是最后一个节点
        {
                pp = p;         //用来保留前一个节点的状态
                p = p->pNext;   //走向下一个节点,也就是循环增量

                if(p->data == data)     //判断这个节点是否是我们想要删除的那个节点
                {
                        if(NULL == p->pNext)    //1.如果找到的是尾节点
                        {
                                pp->pNext = NULL;       //原来尾节点的前一个为节点变成了新尾节点
                                free(p);        //释放原来尾节点的内存
                        }
                        else    //如果找到的是普通节点
                        {
                                pp->pNext = p->pNext;   //要删除的节点的前一个节点和后一个节点相连
                                free(p);
                        }


                        return 0;
                }
        }
        //到这里还没有找到,就说明链表中没有我们想要的那个节点
        printf("没找到这个节点\n");
        return -1;

}

int main(void)
{
        //定义头指针
        //struct node *pHeader = NULL;  这里如果把pHeader赋值为NULL在加入节点这个函数内就会出现段错误
        struct node *pHeader = creat_node(0);

        insert_head(pHeader,creat_node(1));

        insert_head(pHeader,creat_node(2));

        insert_head(pHeader,creat_node(3));


        printf("header node data = %d\n",pHeader->data);        //打印有多少个节点

        //bianli(pHeader);
        printf("删除前================\n");
        bianli2(pHeader);
        delete_node(pHeader,1);
        printf("删除后================\n");
        bianli2(pHeader);

        return 0;
}

输出结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表之删除节点 的相关文章

  • 关于Keil在stm32编写库函数时头文件找不到的解决方法

    最近在自主学习stm32时遇到了fatal error xff1a h files not found xff0c 总结了一下自己的解决方法 1 首先检查在add files有没有选择all files xff0c 如果默认选择source
  • bypassuac的学习

    什么是UAC 为什么要绕过他MSF自带的bypassuac模块 在Vista及更高版本中通过弹框进一步让用户确认是否授权当前可执行文件来达到阻止恶意程序的目的 为什么要绕过他 为了远程执行目标的exe或者bat可执行文件绕过此安全机制 xf
  • thinkphp3.2.3学习(1)

    thinkphp3 2 3学习 xff08 1 xff09 MVC结构 MVC结构 M gt model数据模型 V gt view识图 C gt controller控制器 lt php return array 39 配置项 39 61
  • thinkphp3.2.3学习(2)

    thinkphp3 2 3学习 xff08 2 xff09 如何读取配置文件路由四种url模式url的设置 函数控制器绑定参数url生成跳转页面重定向输入变量 如何读取配置文件 使用C函数 C 属性名 xff1b 动态配置 C 属性名 xf
  • xdebug下载与配置,有这一篇就够了

    xdebug下载与配置 xff0c 有这一篇就够了 xdebug下载与配置环境步骤一步骤二步骤三步骤四步骤五遇到的问题解决方案第一个坑第二个坑第三个坑 下面是我的xdebug的配置 xdebug下载与配置 下载xdebug的地方https
  • windows下3389端口开启和连接

    windows下3389端口开启和连接 开启3389的命令关闭防火墙的命令添加用户添加到管理员组特殊情况 netstat ano 查看端口开放情况 开启3389的命令 REG ADD HKLM SYSTEM CurrentControlSe
  • ssrf绕过

    ssrf绕过 当涉及到SSRF xff08 服务器端请求伪造 xff09 时 xff0c 可以使用以下5种有效负载绕过防御 xff1a 1 xff09 使用CIDR绕过SSRF xff1a http 127 127 127 127 http
  • 测试点的payload

    一些测试点的payload xff0c 后续继续补充 电子邮件地址图片名字 电子邮件地址 以下payload都是有效的电子邮件地址 XSS xff08 跨站脚本 xff09 xff1a test 43 lt script gt alert
  • Jetson Nano GPIO使用、四种模式以及串口解释

    参考 xff1a http www waveshare net study portal php mod 61 view amp aid 61 882https www jianshu com p f98a69b94debhttps blo
  • 一些权限的绕过

    一些权限的绕过 URI绕过后台URI绕过403 URI绕过后台 这是通过以下方式URI来访问后台的技巧 xff1a https target com admin gt HTTP 302 xff08 重定向到登录页面 xff09 https
  • redis的安装以及漏洞学习

    redis的安装以及漏洞学习 redis的安装redis的基本命令redis的一些漏洞redis未授权redis写入文件redis计划任务反弹shell写ssh公钥登录redis主从以上提到的这些漏洞 xff0c 都是基于未授权访问 red
  • python批量检测域名和url能否打开

    python批量检测域名和url能否打开 python批量检测域名和url能否打开批量在浏览器中打开url或者域名总结 最近在挖src xff0c 然后有大量的域名 xff0c 而且大部分打不开 xff0c 所以就很浪费时间 xff0c 写
  • Failed to restart network.service: Unit network.service not found.

    解决 Failed to restart network service Unit network service not found 输入命令时遇到了问题 span class token function service span ne
  • nginx的启动,停止

    nginx的启动 xff0c 停止 启动启动代码格式 nginx的停止有三种方式 xff1a 从容停止快速停止强制停止 验证nginx配置文件是否正确方法一 xff1a 进入nginx安装目录sbin下 xff0c 输入命令 nginx t
  • 虚拟机连不上网解决办法,以及出现Ubuntu connect: Network is unreachable

    虚拟机连不上网解决办法 xff0c 以及出现Ubuntu connect Network is unreachable 问题来源具体过程 问题来源 出现了Ubuntu connect Network is unreachable这个问题 x
  • linux持久化

    linux持久化后门 添加超级用户SUID shellalias 后门inetdcrontab后门ssh公钥免密ssh软连接SSH wrapper后门PAM隐身登录隐藏文件Git hooksPROMPT COMMAND后门PROMPT CO
  • linux恶意进程隐藏

    https mp weixin qq com s 6Z4tErcnusYHTqiSUSVz3A https blog csdn net nzjdsds article details 82919100
  • 图图图图图

  • windows提权总结

    windows提权总结 内核溢出提权Windows系统配置错误提权系统服务权限配置错误注册表键AlwaysInstallElevated可信任服务路径漏洞自动安装配置文件计划任务 Windows组策略首选项提权 SYSVOL GPP SYS
  • 运行Intel realsense L515相机

    运行Intel realsense L515相机 首先去官 https www intelrealsense com sdk 2 xff0c 按照上面的提示安装各种文件 xff0c 然后输入realsense viewer出现可视化窗口 下

随机推荐

  • python的shellcode_loader解释

    python的shellcode loader解释 代码 loader传到主机执行 xff0c shellcode传到自己的服务器上 简单的python shellcode加载器 xff0c 直接上代码 xff0c 注释都在代码里 代码 s
  • 「网络工程师必会技能」-路由器介绍和路由器基本配置

    网络工程师必会技能 路由器介绍和路由器基本配置 xff0c 这是每个网络必须会的技能 xff0c 不是你有证书就一个网络工程师了哦 xff01 以Cisco路由器为例说明 xff1a xff08 1 xff09 访问路由器 访问路由器与访问
  • 英飞凌微控制器,驱动物联网的关键“大脑”

    英飞凌微控制器 xff0c 驱动物联网的关键 大脑 英飞凌各种各样的传感器以及基于它们的创新应用 xff0c 可谓是打开了传感器的 兵器库 xff0c 令人大开眼界 今天 xff0c 我们将进入 计算 这一环节 xff0c 看看唯样商城代理
  • EMC对策产品:TDK扩大了内置ESD保护功能的陷波滤波器阵容

    EMC对策产品 xff1a TDK扩大了内置ESD保护功能的陷波滤波器阵容 新的陷波滤波器同时实现了ESD保护和最大频率为5 3 GHz频段噪声抑制抑制无线通信中产生的TDMA噪声 xff0c 提高无线信号接收灵敏度强大的静电保护能力 xf
  • 这27个电源符号,别再分不清 快收藏起来学习

    这27个电源符号 xff0c 别再分不清 xff01 快收藏起来学习 以下的V代表Volatge的意思 电源符号 解析 VCC C可以理解为三极管的集电极Collector或者电路Circuit xff0c 指电源正极 VDD D可以理解为
  • 74ls160引脚图引脚图和功能真值表

    74ls160引脚图管脚图及功能真值表 xff0c 74ls160引脚图管脚图74LS160的功能真值表 综合电路图 74ls160引脚图管脚图 74LS160的功能真值表 唯样商城是本土元器件目录分销商 xff0c 采用 小批量 现货 样
  • 最全74HC04六反相器中文资料|引脚图及功能表|应用电路图

    最全74HC04六反相器中文资料 引脚图及功能表 应用电路图 最全74HC04六反相器中文资料 引脚图及功能表 应用电路图 xff0c 该74HC04 74HCT04是高速CMOS器件 xff0c 低功耗肖特基的TTL LSTTL 电路 功
  • 房卡一插就有电 酒店插卡取电原理解析

    房卡一插就有电 酒店插卡取电原理解析 酒店插卡取电的原理是什么 xff0c 入住酒店只需用房卡一插就有电 xff0c 原理是什么呢 xff1f 只是一张塑料片不能导电的啊 导读 xff1a 酒店插卡取电的原理是什么 xff0c 入住酒店只需
  • SiC MOSFET驱动电压的分析及探讨

    SiC设计干货分享 xff08 一 xff09 xff1a SiC MOSFET驱动电压的分析及探讨 随着制备技术的进步 xff0c 在需求的不断拉动下 xff0c 碳化硅 xff08 SiC xff09 器件与模块的成本逐年降低 相关产品
  • EM-500储能网关的AI采集性能实测

    EM 500储能网关的AI采集性能实测 EM 500是致远电子面向工商储能应用推出的高性价比储能网关产品 为满足采集外部传感器数据需要 xff0c EM 500设计内置了多通道高性能AI采集接口 xff0c 本文将对其进行一次实测 EM 5
  • 【IoT开发】UART通信高频测试

    测试所使用芯片 STM32F103RCT6 UART收发的极限频率 xff1a bytes s 1 发送频率 主程序循环发送一字节u8整型 xff0c 记录次数 while 1 t 43 43 if t 61 61 255 t 61 0 p
  • 560V输入、无光隔离反激式转换器

    560V输入 无光隔离反激式转换器 在传统的隔离式高压反激式转换器中 xff0c 使用光耦合器将稳压信息从副边基准电压源电路传输到初级侧 xff0c 从而实现严格的稳压 问题在于 xff0c 光耦合器大大增加了隔离设计的复杂性 xff1a
  • 用于DC-DC转换器的MIL-SPEC COTS EMC输入滤波器

    用于DC DC转换器的MIL SPEC COTS EMC输入滤波器 DC DC转换器的开关动作可能会引起不良的共模和差模噪声 xff0c 在频谱的许多点上创建不可接受的干扰 前端 xff08 或电力线 xff09 滤波器旨在在DC DC转换
  • C语言中调用nop();解决办法

    C语言中调用 nop 解决办法 可在头文件中添加 include lt intrins h gt 或是直接删去 nop intrins h一般用在keilC51单片机编程中 xff0c 一般程序中需要使用到空指令 nop 字符循环移位指令
  • rosrun teleop_twist_keyboard teleop_twist_keyboard.py

    rospack Error package teleop twist keyboard not found 解决方案 xff1a 1 cd catkin ws src xff08 如果没有这个目录先在工作目录下创建工作空间 xff1a mk
  • ubuntu20.04安装ros配置秘钥时出现gpg: keyserver receive failed: Connection timed out

    gpg keyserver receive failed Connection timed out也是从公钥服务器接收失败 xff1a 连接超时 解决方案1 换自己的手机热点 解决方案2 切换网络配置 xff1a 这大多数是网络的问题 xf
  • rosbag的命令使用以及代码编写

    概念 xff1a rosbag是用于录制和回放 ROS 主题的一个工具集 作用 实现了数据的复用 xff0c 方便调试 测试 本质 xff1a rosbag本质也是ros的节点 xff0c 当录制时 xff0c rosbag是一个订阅节点
  • 格式化串漏洞

    格式化字符串漏洞本身并不算缓冲区溢出漏洞 xff0c 这里作为比较典型的一类漏洞进行简单介绍 为了能够将字符串 变量 地址等数据按照指定格式输出 xff0c 通常使用包含格式化控制符的常量字符串作为格式化串 xff0c 然后指定用相应变量来
  • 单链表的遍历

    1 什么是遍历 遍历就是把单链表的各个节点挨个拿出来 xff0c 一个不能少 xff0c 也不能重复 xff0c 追求效率 2 如何遍历单链表 xff08 1 xff09 分析数据结构的本身特点 xff0c 然后根据根据它本身的特点制定相应
  • 单链表之删除节点

    1 删除节点的步骤 xff08 1 xff09 找到要删除的这个节点 xff1a 通过遍历来查找节点 xff0c 从头指针 43 头节点开始 xff0c 顺着链表依次将各个节点拿出来 xff0c 按照一定的方法比对 xff0c 找到我们要删