C语言单链表的算法之删除节点

devtools/2024/11/14 12:53:57/

一:为什么要删除节点

        (1)有时候链表中节点的数据不想要了,就要删除这个节点

二:删除节点的两个步骤

        (1)第一步:找到这个节点

        (2)第二步:删除这个节点

三:如何找到待删除的节点

        (1)通过遍历来查找节点1.从头指针+头节点开始,顺着链表依次将各个节点拿出来,按照一定的方法对比,找到要删除的那个节点

四:如何删除一个节点

        1:待删除的节点不是尾节点的情况

                (1)第一步:把待删除的节点的前一个节点的pnext指针指向待删除节点的下一个节点的首地址(这样就把要删除的那个节点从链表中摘出来了)

                (2)第二步:把这个摘出来的节点free掉

                

        2:待删除的节点是尾节点的情况

                (1)第一步:把待删除的尾节点前一个节点的pnext指针指向null(相当于原来尾节点的前一个节点变成了尾节点)

                (2)第二步将之前的尾节点free掉

函数实现代码:

/*****************************************
函数名:delete
返回值:0 或 -1 返回0表示删除成功 -1 表示删除失败
参数:ph:单链表的头指针 data:需要删除的节点的数据区存放的数据(通过数据找到对应的节点来删除这个节点)
作用:通过头指针访问单链表,对链表的各个节点进行遍历,当找到某个节点的有效数据区的数据是指定的那个时,删除那个对应的节点
*****************************************/
int delete(struct node *ph,int data)    
{struct node *p = ph;        //定义一个临时指针变量,将它执行头指针struct node *prev = NULL;   //再定义一个临时指针变量用来存放要删除的节点的上一个节点//的位置,因为进行遍历时指针已经指向后面返回不了前面//而要为了实现只是删除某个节点,并且保证链表还是能正常//访问,需要要删除的前一个节点的pnext执行要删除的节点//的后一个节点的首地址,所以需要留有要删除的节点的前一个//节点的位置  int cat = 0;                //用来修改节点计数区while(NULL !=  p->pNEXT)    //判断是否指针NULL    {prev = p;       p = p->pNEXT;   if(p->datas == data)  //判断当前节点是不是要删除的那个节点{//进入即说明这个节点是要删除的节点if(NULL == p->pNEXT)    //再次进行判断这个节点是不是尾节点{       prev->pNEXT  = NULL;   //是尾节点就将要删除的前一个节点//指向NULL让前一个节点变成尾部free(p);               //删除节点 cat = ph->datas;       //临时变量读取头指针数据区存放的//节点数ph->datas = cat -1;    //将之前头指针存放的数据进行-1//再赋值给头指针的有效数据区}else{prev->pNEXT  = p->pNEXT;free(p);cat = ph->datas;ph->datas = cat -1;}   return 0;}    }return -1;}

完整程序代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>struct node
{int datas;struct node *pNEXT;};struct node *create(int a)
{struct node *p = (struct node *)malloc(sizeof(struct node));if(NULL == p){printf("malloc error!\n");return NULL;}memset(p,0,sizeof(struct node));  //bzero(p,sizeof(struct node));p->datas = a;p->pNEXT = NULL;return p;}void insert_tail(struct node *phead,struct node *new)
{struct node *p = phead;int cat = 0;while(NULL !=  p->pNEXT){p = p->pNEXT;cat++;}p->pNEXT = new;phead->datas = cat +1;}void insert_head(struct node *head,struct node *new)
{new->pNEXT =  head->pNEXT;head->pNEXT = new;head->datas += 1;}void ergodic(struct node *ph)
{struct node *p = ph;int cat = 0;printf("datas number is a: %d\n",p->datas);while(NULL !=  p->pNEXT){cat++;printf("datas number is :%d\n",cat);  p = p->pNEXT;  printf("datas is: %d\n",p->datas);    }}int delete(struct node *ph,int data)
{struct node *p = ph;struct node *prev = NULL;int cat = 0;while(NULL !=  p->pNEXT){prev = p;p = p->pNEXT; if(p->datas == data){if(NULL == p->pNEXT){       prev->pNEXT  = NULL;free(p);cat = ph->datas;ph->datas = cat -1;}else{prev->pNEXT  = p->pNEXT;free(p);cat = ph->datas;ph->datas = cat -1;}   return 0;}    }return -1;}int main(void)
{struct node *phead = create(0);insert_tail(phead,create(12));   insert_tail(phead,create(13));insert_tail(phead,create(14));ergodic(phead);     //遍历打印各个节点数据区delete(phead,13);   //删除数据区为13的节点ergodic(phead);    //再次遍历打印各个节点数据区return 0;}

运行结果:

 

五:注意堆内存的释放

        (1)当程序运行结束时堆内存就会被释放,在结束之前没有free释放掉的堆内存也会被释放掉

        (2)有时候程序运行时间久,这时候malloc的内存没有free会一直被占用直到free释放或程序终止


http://www.ppmy.cn/devtools/56190.html

相关文章

数据库调优厂商 OtterTune 宣布停止运营

昨天刷到消息&#xff0c;得知数据库优化厂商 OtterTune 停止了运营。OtterTune 的成员主要来自 CMU Andy Pavlo 教授领导的数据库实验室。公司正式成立于 2021 年 5 月&#xff0c;融资了 1450 万美金。 按照 Andy 教授的说法&#xff0c;公司是被一个收购 offer 搞砸了。同时…

游戏心理学Day28

独立游戏团队架构 独立游戏工作室是一个包括编程美术设计院校项目管理和运营等各种职能的团队找到可以共同奋斗。数月甚至数年的合适人选并不是一件容易的事情。游戏开发过程中要涉及多种常规工作。小团队的每个成员通常都要身兼数职&#xff0c;而且有些角色常由多人担任。 …

揭秘系统架构:从零开始,探索技术世界的无限可能

文章目录 引言一、系统架构的基本概念二、系统架构的设计原则模块化可扩展性高可用性安全性 三、常见的系统架构模式1. **分层架构&#xff08;Layered Architecture&#xff09;**&#xff1a;2. **微服务架构&#xff08;Microservices Architecture&#xff09;**&#xff1…

IPython介绍及使用技巧整理

IPython&#xff08;Interactive Python&#xff09;是一个增强版的Python交互式解释器&#xff0c;它提供了比标准Python解释器更为强大的交互式计算功能。IPython项目最初由Fernando Prez于2001年发起&#xff0c;旨在提供一个更高效、更易用的交互式Python环境。随着时间的推…

软件设计师笔记-系统开发和运行知识(三)

软件质量保证 软件质量保证&#xff08;SQA&#xff09;是确保软件开发和维护活动遵循预定计划、标准和规程的过程。在软件质量保证中&#xff0c;应用技术方法、进行正式的技术评审、测试软件、实施标准、控制变更、度量、记录保存和报告都是关键的活动。以下是对这些活动的详…

SUSE linux 15的网络管理

1 手工配置网络 wicked提供了一种新的网络配置框架。自SUSE 12起&#xff0c;SUSE使用了新的网络管理工具wicked&#xff0c;这个是区别与其他常见发行版的。常见的发行版目前大多使用的是NetworkManager服务进行网络管理。 1.1 wicked网络配置 传统网络接口管理面临的挑战之…

【Ant Design Vue的更新日志】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

PlatformIO开发环境

PlatformIO是一个开源的生态系统&#xff0c;用于构建物联网应用&#xff0c;它支持多种微控制器&#xff08;MCU&#xff09;和硬件开发板&#xff0c;并且与各种IDE集成良好&#xff0c;如VSCode, Atom等&#xff0c;使得跨平台的固件开发变得更加简单和高效。 ### 平台介绍…