当前位置:   article > 正文

数据结构单链表插入和删除操作_数据结构单链表的插入与删除

数据结构单链表的插入与删除

单链表:先回顾单链表的特点  逻辑相邻 物理上不一定相连

首先初始化单链表,其中主要保存的是该节点自身的值以及下个节点的地址。

  1. 有效节点结构体设计:
  2. struct Node{
  3. int data;//数据域
  4. struct Node* next;//指针域
  5. }

以下是单链表的插入以及删除操作:

(一)插入操作

单链表的插入主要分为头插,尾插,以及按位置插入这三种来进行操作。

(1)头插

  1. bool Insert_head(PNode pn, int val)
  2. {
  3. assert(pn!=NULL);//判断不为空
  4. //1.申请新节点
  5. struct Node* pnewnode = (struct Node*)malloc(1 * sizeof(struct Node));
  6. assert(pnewnode != NULL);
  7. pnewnode->data = val;
  8. pnewnode->next = NULL; // 这里可写可不写
  9. //2.找到合适的插入
  10. //头插时插入在头结点的后边,所以不用找
  11. //3.插入
  12. pnewnode->next = p->next;//先让C指向B (不能先断开AB中间的线 不然找不到B)
  13. p->next = pnewnode;//此时再让A指向C
  14. return true;
  15. }

(2)尾插

  1. bool Inseret_tail(PNode pn, int val)
  2. {
  3. //1.申请新节点
  4. struct Node* pnewnode = (struct Node*)malloc(1 * sizeof(struct Node));
  5. assert(pnewnode != NULL);
  6. pnewnode->data = val;
  7. pnewnode->next = NULL; // 这些步骤都与前面的一样
  8. //2.找到合适的插入位置(尾插,需要一个临时指针p指向尾结点)
  9. struct Node* p = pn;
  10. for (p; p->next != NULL; p = p->next);
  11. //3.插入
  12. pnewnode->next = p->next;
  13. p->next = pnewnode;
  14. return true;
  15. }

(3)按位置插入(将C插入到AB)

  1. bool Inseret_pos(PNode pn, int pos, int val)
  2. {
  3. assert(pos >= 0 && pos <= Get_length(pn));
  4. //1.申请新节点
  5. struct Node* pnewnode = (struct Node*)malloc(1 * sizeof(struct Node));
  6. assert(pnewnode != NULL);//确保申请成功
  7. pnewnode->data = val;//传入val
  8. pnewnode->next = NULL; //
  9. //2.找到合适的插入位置(按位置插入AB之间,在这里发现规律,pos等于几则让指向头结点的指针p向后走pos步,此时p指向AB的A)
  10. struct Node* p = pn;
  11. for (int i = 0; i < pos; i++)
  12. {
  13. p = p->next;
  14. }
  15. //3.插入
  16. pnewnode->next = p->next;//先让C指向B (不能先断开AB中间的线 不然找不到B)
  17. p->next = pnewnode;//此时再让A指向C
  18. return true;
  19. }

按位置插入这里改变pos的值便可以实现头插和尾插。

(二)删除操作

(1)头删

  1. bool Del_head(PNode pn)
  2. {
  3. //assert
  4. if (IsEmpty(pn))
  5. {
  6. return false;
  7. }
  8. struct Node* p = pn->next;//pn是头结点 pn->next则是第一个有效节点地址 即头删的节点 则此时p指向待删除节点
  9. //将待删除节点跨越指向(让带删除节点上家的next域指向下家的地址,而下家的地址在待删节点p的next中)
  10. pn->next = p->next;
  11. free(p);
  12. p = NULL;
  13. return true;
  14. }

(2)尾删

  1. bool Del_tail(PNode pn)
  2. {
  3. //assert
  4. if (IsEmpty(pn))
  5. {
  6. return false;
  7. }
  8. //找到待删除节点用p指向(尾删的待删除节点就是倒数第一个节点)
  9. struct Node* p = pn;
  10. for (p; p->next != NULL; p = p->next);//当P指向的next域为空停下来
  11. //q指向倒数第二个节点
  12. struct Node* q = pn;
  13. for (q; q->next != p; q = q->next);
  14. q->next = pn;//q->next = p->next;
  15. free(p);
  16. return true;
  17. }

(3)按位置删    同样这里改变pos的值能实现头删和尾删

  1. bool Del_pos(PNode pn, int pos)
  2. {
  3. //assert
  4. assert(pos >= 0 && pos < Get_length(pn));
  5. if (IsEmpty(pn))//注意这里的判空操作在后面有定义
  6. {
  7. return false;
  8. }
  9. //先找到待删除节点的上一个节点,用q指向 规律:pos等于几 q就向后走几步
  10. struct Node* q = pn;
  11. for (int i = 0; i < pos; i++)
  12. {
  13. q = q->next;
  14. }
  15. //此时 q指向待删除节点的上一个节点
  16. //接下来 再让p指向待删除节点 待删除节点在q的next中
  17. struct Node* p = q->next;
  18. //跨越指向,再释放
  19. q->next = p->next;
  20. free(p);//删除待删除节点
  21. return true;
  22. }
  23. bool IsEmpty(PNode pn)
  24. {
  25. return pn->next == NULL;
  26. }

(4)按值删

  1. bool Del_val(PNode pn, int val)
  2. {
  3. //assert
  4. if (IsEmpty(pn))
  5. {
  6. return false;
  7. }
  8. struct Node* p = Search(pn, val);//判断value是否存在
  9. if (p == NULL)//search返回的地址为空代表没找到
  10. {
  11. return false;
  12. }
  13. //此时待删除节点存在, 且用指针p指向
  14. struct Node* q = pn;
  15. for (q; q->next != p; q = q->next);
  16. //再申请一个临时指针q 让q指向p的上一个节点
  17. q->next = p->next;
  18. free(p);
  19. //跨越指向,和释放
  20. return true;
  21. }
  22. //查找
  23. struct Node* Search(PNode pn, int val)
  24. {
  25. //assert
  26. for (struct Node* p = pn->next; p != NULL; p = p->next)
  27. {
  28. if (p->data == val)
  29. {
  30. return p; //找到 则扔出去
  31. }
  32. }
  33. return NULL; //没找到,返回NULL地址
  34. }

以上便是一些单链表的相关操作,简单可直接拿去使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/515525
推荐阅读
相关标签
  

闽ICP备14008679号