码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 1.(5)数据结构之链表的插入和删除结点(有图有程序有注释)


     本人坚持更新C语言,数据结构,操作系统,前端知识,可以收藏+关注随时了解😜😜😜 


    目录

    一、链表的插入

    1.关于链表的插入,首先我们先明确,往链表里面插入一个结点需要的参数都有哪些

    2.明确插入节点的思想是什么

    接下来我们通过代码实现

    二、链表删除结点

    1.删除结点需要的参数

    2.删除节点的思想

    程序

    总结


    在前面我们已经了解到了链表的创建,遍历,判空,求长度,排序

    这次我们来了解链表的插入和删除

    一、链表的插入

    1.关于链表的插入,首先我们先明确,往链表里面插入一个结点需要的参数都有哪些

    1.我们确定一个链表,只需要知道它的头结点,因此需要的第一个参数是头节点(pHead)来确定这条链表

    2.我们需要知道在那个位置插入(position)

    3.我们需要知道插入的值是什么(val)

    2.明确插入节点的思想是什么

    如果我们想要在第pos个位置插入一个结点,我们最重要的就是找到第pos个节点的前一个结点,然后我们动态的创建一个新的结点,将它插入。

    图解如下

     

     

    接下来我们通过代码实现

    1.首先定义结构体变量,通过它来表示结点

    1. typedef struct Node
    2. {
    3. int data; //数据域
    4. struct Node *pNext; //指针域
    5. } NODE, *PNODE; // NODE等于struct Node,PNODE等价于struct Node*

    2.插入节点的程序

    1. //在pHead所指向的链表的第pos结点的前面插入一个新的结点,该节点的值是val,并且pos的值是>=1
    2. bool insert_list(PNODE pHead, int pos, int val)
    3. {
    4. //我们想要在pos结点前面插入一结点,关键是找到pos-1这个结点
    5. int i = 0;
    6. PNODE p = pHead; // 先定义p指向头节点,最终p指向pos的前一个结点
    7. //这个循环下来,我们就找到了pos-1结点
    8. while (p->pNext != NULL && i < pos - 1)
    9. {
    10. p = p->pNext;
    11. i++;
    12. }
    13. if (i > pos - 1 || p->pNext == NULL) // i>pos-1防止有人输入pos的值是负数
    14. {
    15. return false;
    16. }
    17. PNODE pNew = (PNODE)malloc(sizeof(NODE)); //创建新节点
    18. if (NULL == pNew)
    19. {
    20. printf("fail to distribute memory,the procedure is over!\n");
    21. exit(-1);
    22. }
    23. pNew->data = val;
    24. PNODE q = p->pNext; // q为pos处的结点
    25. pNew->pNext = q;
    26. p->pNext = pNew;
    27. return true;
    28. }

    整个过程是:

            1.定义指针变量p,指向头节点,通过i

            2.找到后动态的创建一个新的结点

            3.插入结点

    二、链表删除结点

    1.删除结点需要的参数

    1.pHead头结点来确定链表

    2.删除节点的位置pos

    3.需要一个参数来返回删除的值(现实生活的很多情况下需要将删除的值保存)

    2.删除节点的思想

    同样的,如果我们想删除pos位置的结点,我们需要先找到pos节点的前一个结点,然后将pos结点释放。

    程序

    1. bool delete_list(PNODE pHead, int pos, int *pVal)
    2. {
    3. int i = 0;
    4. PNODE p = pHead; // p为pos前的那个结点
    5. //这个循环下来,我们就找到了pos-1结点
    6. while (p->pNext != NULL && i < pos - 1)
    7. {
    8. p = p->pNext;
    9. i++;
    10. }
    11. if (i > pos - 1 || p->pNext == NULL)
    12. {
    13. return false;
    14. }
    15. PNODE q = p->pNext;
    16. *pVal = q->data; //将删除的值保存
    17. //删除结点
    18. p->pNext = q->pNext;
    19. free(q); //将q所指向的内存单元释放
    20. q = NULL; // q这个指针遍历并没有被释放,赋值为空,避免出现野指针
    21. return true;
    22. }

     整个过程是:

    1.定义指针变量p,指向头节点,通过i

    2.定义q指针变量指向p的下一个结点,也就是pos位置的结点

    3.通过p->pNext->q->pNext,使得p位置的结点直接指向pos位置后面的结点,达到删除pos节点的效果

    4.free(q),来释放q所指向的内存单元,只有动态分配(malloc)的内存单元,才需要用free(q),

    free(q)的意思是释放q所指向的内存单元,而不是释放了指针变量p,p是静态创建的不需要手动释放。

    5.令q=NULL,将指针变量q的内容清空,防止出现野指针

    6.return true表示删除成功

    总结


    删除和插入操作,主要的思想就是找到,插入或删除位置的前一个结点。

     

  • 相关阅读:
    Linux驱动开发——USB设备驱动
    机器学习基础之《分类算法(8)—随机森林》
    25、Camunda Service Task、任务监听器和执行监听器
    栈与队列2:用队列实现栈
    Go实战学习笔记-1.2基础语法:变量、常量、包、指针等
    SOLIDWORKS Visualize 界面介绍
    算法总结:递归优化,二路归并,快速幂
    java毕业生设计高校共享机房管理系统的设计与实现计算机源码+系统+mysql+调试部署+lw
    HTML5期末大作业:仿商城网站设计—— 绿色特产商城购物Html+Css+javascript的网页制作
    GIT命令只会抄却不理解?看完原理才能事半功倍!
  • 原文地址:https://blog.csdn.net/weixin_46637351/article/details/125987507
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号