• 线性表-顺序表学习笔记(基础)


     属于线性表旗下的一种,所以专门存储 one-to-one 关系的数据。

    顺序表提供的具体实现方案是:将数据全部存储到一整块内存空间中,数据元素之间按照次序挨个存放。(类似数组)

    顺序表中除了存储数据本身的值外,而一般提供了以下数据:

    • 顺序表的最大存储容量:即顺序表最多可以存储的数据量
    • 顺序表的长度:目前顺序表中存储的数据个数

    C 语言实现代码:

    1. #include
    2. #include
    3. #define MAXSIZE 5 //对MAXSIZE进行宏定义,表示顺序表的最大容量
    4. /*结构体*/
    5. typedef struct {
    6. int* head; //利用指针定义一个长度不确定的“数组”(动态数组)
    7. int length; //记录顺序表的长度
    8. int size; //记录顺序表的存储容量
    9. }SeqList;
    10. /*初始化*/
    11. void init(SeqList* sl)
    12. {
    13. //构造一个空的顺序表,动态申请存储空间
    14. sl->head = (int*)malloc(MAXSIZE * sizeof(int)); //初始化head数组
    15. //如果申请失败,作出提示并直接退出程序
    16. if (!sl->head) //判断head数组是否完成初始化
    17. {
    18. printf("初始化失败\n");
    19. exit(0);
    20. }
    21. sl->length = 0;
    22. //空表的长度初始化为0
    23. sl->size = MAXSIZE;
    24. //空表的初始存储空间为MAXSIZE
    25. }
    26. /*判空*/
    27. int empty(SeqList* sl)
    28. {
    29. if (sl->length == 0)
    30. return 1;
    31. else
    32. return 0;
    33. }
    34. /*长度*/
    35. int length(SeqList* sl)
    36. {
    37. return sl->length;
    38. }
    39. /*建立*/
    40. int creat(SeqList* sl, int creat[], int extent) //顺序表,数组,长度
    41. {
    42. if (extent > MAXSIZE)
    43. {
    44. printf("空间不够\n");
    45. return 0;
    46. }
    47. for (int i = 0; i < extent; i++)
    48. {
    49. sl->head[i] = creat[i];
    50. }
    51. sl->length = extent;
    52. return 1;
    53. }
    54. /*插入*/
    55. int insert(SeqList* sl, int index, int value) //顺序表,索引,插入值
    56. {
    57. if (sl->length == MAXSIZE)
    58. {
    59. printf("上溢出错误\n");
    60. return 0;
    61. }
    62. if (index < 1 || index > sl->length + 1)
    63. {
    64. printf("插入位置错误(从1开始)\n");
    65. return 0;
    66. }
    67. for (int i = sl->length; i >= index; i--)
    68. {
    69. sl->head[i] = sl->head[i - 1];
    70. }
    71. sl->head[index - 1] = value;
    72. sl->length++;
    73. return 1;
    74. }
    75. /*删除*/
    76. int delete(SeqList* sl, int index, int value) //顺序表,索引,删除值
    77. {
    78. if (sl->length == 0)
    79. {
    80. printf("发生下溢错误\n");
    81. return 0;
    82. }
    83. if (index > sl->length || index < 1)
    84. {
    85. printf("删除位置错误\n");
    86. return 0;
    87. }
    88. value = sl->head[index - 1]; //把要删除的数据返回
    89. for (int i = index; i <= sl->length; i++)
    90. {
    91. sl->head[i - 1] = sl->head[i];
    92. }
    93. sl->length--;
    94. return 1;
    95. }
    96. /*修改*/
    97. int set(SeqList* sl, int index, int value)
    98. {
    99. if (index < 1 || index > sl->length)
    100. {
    101. printf("修改位置错误\n");
    102. return 0;
    103. }
    104. sl->head[index-1] = value;
    105. return 1;
    106. }
    107. /*位查找*/
    108. int get(SeqList* sl, int index, int* result)
    109. {
    110. if (index < 1 || index > sl->length)
    111. {
    112. printf("查找位置错误\n");
    113. return 0;
    114. }
    115. else
    116. {
    117. *result = sl->head[index - 1];
    118. return 1;
    119. }
    120. }
    121. /*值查找(查出返回索引值)*/
    122. int locate(SeqList* sl, int value)
    123. {
    124. for (int i = 0; i < sl->length; i++)
    125. {
    126. if (sl->head[i] == value)
    127. {
    128. return i + 1;
    129. }
    130. }
    131. return 0;
    132. }
    133. /*输出*/
    134. void display(SeqList* sl)
    135. {
    136. for (int i = 0; i < sl->length; i++)
    137. {
    138. printf("%d", sl->head[i]);
    139. //if (i == sl->length - 1){printf("%d", sl->head[i]);}
    140. //else{printf("%d,", sl->head[i]);}
    141. }
    142. printf("\n");
    143. }
    144. /*主函数*/
    145. int main() {
    146. int value = 0;
    147. SeqList sl = { NULL, 0, 0 }; //属性初始化
    148. int data[] = { 1,2,3,4 }; //数据
    149. init(&sl); //初始化
    150. if (empty(&sl))
    151. {
    152. printf("目前顺序表为空,长度为:%d\n", length(&sl));
    153. }
    154. creat(&sl, data, 4); //建立
    155. printf("顺序表建立:");
    156. display(&sl); //测试建立(第一次输出)
    157. insert(&sl, 1, 0); //插入
    158. printf("顺序表中存储的元素分别是:\n"); //提示
    159. display(&sl); //测试插入
    160. delete(&sl, 1, value); //删除
    161. display(&sl); //测试删除
    162. set(&sl, 4, 0); //修改
    163. display(&sl); //测试修改
    164. int index = 1, sult = 0; //临时值sult
    165. get(&sl, index, &sult); //位查找
    166. printf("%d 索引值的位查找的数据值是:%d\n", index, sult); //输出位查找的值
    167. printf("%d 数据值的值查找的索引值是:%d\n", 0, locate(&sl, 0)); //输出值查找的值
    168. printf("尾插入:\n");
    169. insert(&sl, 5, 5); //尾插入
    170. display(&sl); //测试尾插入
    171. free(sl.head);//释放申请的堆内存
    172. system("pause"); //暂停黑窗口
    173. return 0;
    174. }

    顺序表和数组的关系及区别

    顺序表 VS 数组
    顺序表(存储结构)数组(数据类型)
    区别顺序表侧重表达了数据之间保持了 “一对一” 的逻辑关系数组是顺序表在实际编程中的一种实现方式
    相同数据存储在一整块内存空间中,数据元素之间紧挨着存放

  • 相关阅读:
    魔众API支持接口数量配额邮件告警
    RocketMQ源码阅读(七)ConsumeQueue和IndexFile
    ElasticSearch :rhel 安装 elasticSearch7.9.0
    新手如何练习SQL?|掌握
    keras 识别手写数字mnist
    SQL语句的执行过程
    Unity 之 音频类型和编码格式介绍
    在uniapp中,如何去掉一些不想要的权限,
    singleflight 防止缓存击穿、并发结果共享(golang官方包和go-zero实现对比)
    Dify后端源码目录结构和蓝图
  • 原文地址:https://blog.csdn.net/2301_76632538/article/details/134231193