当前位置:   article > 正文

数据结构--单链表

数据结构--单链表

一.单链表的设计

1.单链表的结构定义:

typedef struct Node{
int data;//数据域
struct Node* next;//后继指针
}Node,*List;

2.单链表的设计示意图:

image-20230602115022970.png


3.注意:

单链表的最后一个节点的next域为NULL;

4.为什么要有一个头节点?

简单方便,不用传二级指针;

二.单链表的实现

  1. //初始化
  2. }
  3. //考试重点
  4. //删除第一个val的值
  5. bool DelVal(List plist, int val)
  6. {
  7. Node* p = GetPrio(plist, val);
  8. if (p == NULL)
  9. return false;
  10. Node* q = p->next;
  11. //删除q
  12. p->next = q->next;//p->next=p->next->next;
  13. //释放q
  14. free(q);
  15. return true;
  16. }
  17. //返回key的前驱地址,如果不存在返回NULL;
  18. Node* GetPrio(List plist, int key)
  19. {
  20. for (Node* p = plist; p->next != NULL; p = p->next)
  21. {
  22. if (p->next->data == key)
  23. return p;
  24. }
  25. return NULL;
  26. }
  27. //返回key的后继地址,如果不存在返回NULL;
  28. Node* GetNext(List plist, int key)
  29. {
  30. assert(plist != NULL);
  31. if (plist == NULL)
  32. return NULL;
  33. Node* p = Search(plist, key);
  34. if (p == NULL)
  35. return NULL;
  36. return p->next;
  37. }
  38. //输出
  39. void Show(List plist)
  40. {
  41. //注意,头节点不能访问data
  42. for (Node* p = plist->next; p != NULL; p = p->next)
  43. {
  44. printf("%d ", p->data);
  45. }
  46. printf("\n");
  47. }
  48. //清空数据
  49. void Clear(List plist)
  50. {
  51. Destroy(plist);
  52. }
  53. void Destroy(List plist)
  54. {
  55. //总是删除第一个数据节点
  56. Node* p;
  57. while (plist->next != NULL)
  58. {
  59. p = plist->next;
  60. plist->next = p->next;
  61. free(p);
  62. //error
  63. //plist->next = plist->next->next;
  64. //free(plist->next);
  65. }
  66. }

三.单链表的总结

1.单链表的特点:

头插,头删 时间复杂度是O(1)

尾插,尾删 时间复杂度是O(n)

2.P初始化成什么?

如果我们要修改表的结构(或者说依赖于前驱,比如插入,删除):遍历:

for(Node *p=plist;p->next!=NULL;p=p->next)

如果我们不修改表的结构(或者说不依赖于前驱, 比如求长度,打印,查找) :遍历:

for (Node* p = plist->next; p != NULL; p = p->next)
3.注意考点:

头插,尾插,按值删除;

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

闽ICP备14008679号