• 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表示删除成功

    总结


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

     

  • 相关阅读:
    如何用CHAT理解数理化?
    HTML&CSS
    docker常用命令大全
    剩下的数。
    基于springboot+vue实现MOBA类游戏攻略平台项目【项目源码+论文说明】
    2023-10-20 游戏开发-开源游戏-记录
    基于内存的分布式NoSQL数据库Redis(三)常用命令
    1021 Deepest Root
    已解决:开机出现Start PXE over ipv4 & ipv6的情况
    基于python下django框架 实现校园运动场地预约系统详细设计
  • 原文地址:https://blog.csdn.net/weixin_46637351/article/details/125987507