当前位置:   article > 正文

C语言 单链表节点的插入和删除_c 单链 链表 删除

c 单链 链表 删除

用C语言实现单链表的插入和删除,主要用到了“双指针”的方法。

一、有头单链表

1、删除指定节点

  1. void deleteNode_headed(Listnode* head,int deleteData)
  2. {
  3. Listnode* fast = head->next;
  4. Listnode* slow = head;
  5. while(fast != NULL) //遍历链表找到要删除的节点
  6. {
  7. if(fast->data == deleteData)//找到了则删除节点
  8. {
  9. slow->next = fast->next;
  10. free(fast);
  11. fast = NULL;
  12. head->data--;
  13. return;
  14. }
  15. fast = fast->next;
  16. slow = slow->next;
  17. }
  18. printf("The node is not found.\n");//找不到则打印提示信息
  19. return;
  20. }

2、插入指定节点

(1)插入到单链表头部

  1. void insertNode_headed_head(Listnode* head, Listnode* nodeAdded)
  2. {
  3. head->data++;
  4. nodeAdded->next = head->next;
  5. head->next = nodeAdded;
  6. }

(2)插入到单链表尾部

  1. void insertNode_headed_tail(Listnode* head, Listnode* nodeAdded)
  2. {
  3. head->data++;
  4. while(head->next != NULL)
  5. {
  6. head = head->next;
  7. }
  8. head->next = nodeAdded;
  9. nodeAdded->next = NULL;
  10. }

(3)插入到有序单链表,使链表依然有序

  1. void insertNode_headed_ordered(Listnode* head, Listnode* nodeAdded,int(*comp)(const void *, const void *))
  2. {
  3. Listnode* fast = head->next;
  4. Listnode* slow = head;
  5. while(fast != NULL) //寻找比插入节点大的节点
  6. {
  7. if(comp(fast,nodeAdded) > 0) //找到了则插入
  8. {
  9. slow->next = nodeAdded;
  10. nodeAdded->next = fast;
  11. head->data++;
  12. return;
  13. }
  14. fast = fast->next;
  15. slow = slow->next;
  16. }
  17. slow->next = nodeAdded; //没找到则插入到链表的尾部
  18. nodeAdded->next = NULL;
  19. head->data++;
  20. return;
  21. }

二、无头单链表

1、删除指定节点

  1. Listnode* deleteNode_headless(Listnode* head,int deleteData)
  2. {
  3. if(head == NULL) //若为空链表,打印提示信息
  4. {
  5. printf("The node is not found.\n");
  6. return head;
  7. }
  8. Listnode* slow = head;
  9. Listnode* fast = head->next;
  10. if(slow->data == deleteData) //若删除的是第一个节点
  11. {
  12. free(slow);
  13. slow = NULL;
  14. head = fast;
  15. return head;
  16. }
  17. while(fast != NULL) //遍历链表找到要删除的节点
  18. {
  19. if(fast->data == deleteData)//找到了则删除节点
  20. {
  21. slow->next = fast->next;
  22. free(fast);
  23. fast = NULL;
  24. return head;
  25. }
  26. fast = fast->next;
  27. slow = slow->next;
  28. }
  29. printf("The node is not found.\n");//找不到则打印提示信息
  30. return head; //因为可能会将头节点赋值为NULL(只有一个节点,且需要删除的情况),
  31. } //又因为是值传递的头节点,所以要返回头节点

2、插入指定节点

(1)插入到单链表头部

  1. Listnode* insertNode_headless_head(Listnode* head, Listnode* nodeAdded)
  2. {
  3. nodeAdded->next = head;
  4. return nodeAdded;
  5. }

(2)插入到单链表尾部

  1. Listnode* insertNode_headless_tail(Listnode* head, Listnode* nodeAdded)
  2. {
  3. if(head == NULL) //判断是否是空链表
  4. {
  5. nodeAdded->next = NULL;
  6. return nodeAdded;
  7. }
  8. Listnode* temp = head;
  9. while(temp->next != NULL)
  10. {
  11. temp = temp->next;
  12. }
  13. temp->next = nodeAdded;
  14. nodeAdded->next = NULL;
  15. return head;
  16. }

(3)插入到有序单链表,使链表依然有序

  1. Listnode* insertNode_headless_ordered(Listnode* head, Listnode* nodeAdded,int(*comp)(const void *, const void *))
  2. {
  3. if(head == NULL) //判断是否为空链表
  4. {
  5. nodeAdded->next = NULL;
  6. return nodeAdded;
  7. }
  8. Listnode* slow = head;
  9. if(comp(slow,nodeAdded) > 0) //若插入节点比头节点小,则将插入节点作为头节点
  10. {
  11. nodeAdded->next = slow;
  12. return nodeAdded;
  13. }
  14. Listnode* fast = head->next;
  15. while(fast != NULL) //找到比插入节点大的节点
  16. {
  17. if(comp(fast,nodeAdded) > 0) //如果找到则插入
  18. {
  19. slow->next = nodeAdded;
  20. nodeAdded->next = fast;
  21. return head;
  22. }
  23. fast = fast->next;
  24. slow = slow->next;
  25. }
  26. slow->next = nodeAdded; //否则插入到链表尾部
  27. nodeAdded->next = NULL;
  28. return head;
  29. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/859762
推荐阅读
相关标签
  

闽ICP备14008679号