• 数据结构--线性表



    1.线性表的定义:

    存在唯一的一个被称为“第一个”的数据元素

    存在唯一的一个被称为“最后一个”的数据元素;

    除第一个之外,集合中的每一个数据元素都只有一个前驱;

    除最后一个之外,集合中的每一个数据元素都只有一个后继;

    线性表是最简单最常用的一种线性表。

    线性表分为顺序表和链表。

    顺序表又分为定长顺序表和不定长顺序表。


    2. 线性表的顺序表,顺序表的设计思想**

    加入length和左端连续。

    struct SqLsit

    {

    int elem[10];

    int length;

    }SqList;

    同学们现在理解定长顺序表为什么要这样设计了吗?

    结构示意图如下:


    3.实现顺序表的操作(重点)

    1. //不定长顺序表的实现
    2. #include "sqlist.h"
    3. #include
    4. #include
    5. //初始化
    6. void InitSqlist(PSQList ps)
    7. {
    8. assert(ps != NULL);
    9. if (ps == NULL)
    10. return;
    11. ps->length = 0;
    12. }
    13. static bool IsFul(PSQList ps)
    14. {
    15. return ps->length == 10;
    16. }
    17. //插入数据,在ps顺序表的pos位置插入val;
    18. bool Insert(PSQList ps, int pos, int val)
    19. {
    20. assert(ps != NULL);
    21. if (ps == NULL)
    22. return false;
    23. if (pos<0 || pos>ps->length || IsFul(ps))
    24. {
    25. return false;
    26. }
    27. //把数据移动到后面
    28. for (int i = ps->length - 1; i >= pos; i--)
    29. {
    30. ps->elem[i + 1] = ps->elem[i];
    31. }
    32. //插入数据
    33. ps->elem[pos] = val;
    34. //有效数据个数++;
    35. ps->length++;
    36. return true;
    37. }
    38. //判空
    39. bool IsEmpty(PSQList ps)
    40. {
    41. return ps->length == 0;
    42. }
    43. //在ps中查找第一个key值,找到返回下标,没有找到返回-1;
    44. int Search(PSQList ps, int key)
    45. {
    46. for (int i = 0; i < ps->length; i++)
    47. {
    48. if (key == ps->elem[i])
    49. return i;
    50. }
    51. return -1;
    52. }
    53. //删除pos位置的值
    54. bool DelPos(PSQList ps, int pos)
    55. {
    56. assert(ps != NULL);
    57. if (ps == NULL)
    58. return false;
    59. if (pos<0 || pos>=ps->length)
    60. {
    61. return false;
    62. }
    63. //将后面的数据前移
    64. for (int i = pos; i < ps->length - 1; i++)
    65. {
    66. ps->elem[i] = ps->elem[i + 1];
    67. }
    68. //有效数据个数--;
    69. ps->length--;
    70. return true;
    71. }
    72. //删除第一个val的值
    73. bool DelVal(PSQList ps, int val)
    74. {
    75. int i = Search(ps, val);
    76. if (i < 0)
    77. return false;
    78. return DelPos(ps, i);
    79. }
    80. //返回key的前驱下标,如果不存在返回-1;
    81. int GetPrio(PSQList ps, int key)
    82. {
    83. int i = Search(ps, key);
    84. if (i <= 0)//注意头没有前驱
    85. return -1;
    86. return i - 1;
    87. }
    88. //返回key的后继下标,如果不存在返回-1;
    89. int GetNext(PSQList ps, int key)
    90. {
    91. int i = Search(ps, key);
    92. if (i < 0 || i == ps->length - 1)//注意,尾没有后继
    93. return -1;
    94. return i + 1;
    95. }
    96. //输出
    97. void Show(PSQList ps)
    98. {
    99. assert(ps != NULL);
    100. if (ps == NULL)
    101. return;
    102. for (int i = 0; i < ps->length; i++)
    103. {
    104. printf("%d ", ps->elem[i]);
    105. }
    106. printf("\n");
    107. }
    108. //清空数据
    109. void Clear(PSQList ps)
    110. {
    111. ps->length = 0;
    112. }
    113. //销毁整个内存
    114. void Destroy(PSQList ps)
    115. {
    116. Clear(ps);
    117. }

    数据结构的基本含义,简单来说,数据结构就是研究数据(不仅仅是数值的数据)之间的关系以及操作。顾名思义,就是数据的结构,只有你清楚了这些结构如何表现如何处理问题的,你就会发现,数据结构不仅仅拘泥于某一种语言,它更多的是一种思想理念,这样你在实际的编程中你才能运用它,使你的代码更加高效。因为你心中有它,心中有数据结构,那么只要能熟能生巧,你就会自然而然的想到使用它,从而你的代码就会更加高效。


    本篇完!
  • 相关阅读:
    生鲜行业B2B电子商务交易系统:缩短企业供采交易链路,掘金万亿级生鲜B2B
    K8S之初入师门第一篇熟读手册
    威纶通触摸屏的事件记录保存并下载(EasyBuilder Pro)
    分布式id的概述与实现
    ClickHouse 的 MergeTree 引擎读写流程
    Docker的简介
    Flutter自带国际化适配自动生成方案
    神经网络图像识别代码,编码解码神经网络
    【沁恒单片机】MounRiver开发工具官方Demo迁移的处理以及Symbol could not be resolved的处理
    6.吴恩达深度学习--深度卷积模型:案例研究
  • 原文地址:https://blog.csdn.net/m0_75266675/article/details/136614910