当前位置:   article > 正文

数据结构--静态链表

数据结构--静态链表

一.静态链表的结构设计:

typedef struct SNode

{

        int data;//数据

        int next;//后继指针(下标)

}SNode,SLinkList[MAXSIZE];

二.静态链表的结构设计示意图

image-20230611211905665.png


0:有效数据链的头节点;

1:空闲数据链的头节点;

三.静态链表的实现

  1. //初始化
  2. return p;
  3. }
  4. }
  5. return -1;
  6. }
  7. int GetPrio(SNode* ps, int key)
  8. {
  9. for (int p = 0; ps[p].next != 0; p = ps[p].next)
  10. {
  11. //if (ps[ps[p].next].data == key)//ok
  12. int q = ps[p].next;//q为p的后继
  13. if(ps[q].data==key)
  14. {
  15. return p;
  16. }
  17. }
  18. return -1;
  19. }
  20. //删除第一个val的值
  21. bool DelVal(SNode* ps, int val)
  22. {
  23. //获取val的前驱
  24. int p = GetPrio(ps, val);
  25. if (p < 0)
  26. return false;
  27. //将节点从有效数据链表中剔除
  28. int q = ps[p].next;
  29. ps[p].next = ps[q].next;
  30. //将节点添加到空闲链表中
  31. ps[q].next = ps[1].next;
  32. ps[1].next = q;
  33. return true;
  34. }
  35. //输出
  36. void Show(SNode* ps)
  37. {
  38. assert(ps != NULL);
  39. if (ps == NULL)
  40. return;
  41. for (int p = ps[0].next; p != 0; p = ps[p].next)
  42. {
  43. printf("%d ", ps[p].data);
  44. }
  45. printf("\n");
  46. }
  47. //清空数据
  48. void Clear(SNode* ps)
  49. {
  50. assert(ps != NULL);
  51. if (ps == NULL)
  52. return;
  53. InitList(ps);
  54. }
  55. //销毁整个内存
  56. void Destroy(SNode* ps)
  57. {
  58. Clear(ps);
  59. }

四.静态链表的总结

1.静态链表,利用顺序表模拟链表

2.静态链表包含两条链表,一条为有效数据链表,另一条为空闲节点链表

3.有效数据链表为带头结点的循环链表,且头节点在0号下标

4.空闲数据链表为带头结点的循环链表,且头节点在1号下标

5.静态链表的优点:和顺序表对比,插入删除不需要移动数据,O(1)

6.静态链表的优点:和链表对比,不需要频繁的创建和删除节点

7.静态链表的缺点:和顺序表对比,需要增加一个next 8.静态链表可以动态增长,满后扩容,将扩容的内存添加到空闲链表;

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

闽ICP备14008679号