美妙的算法之顺序表

x33g5p2x  于2022-03-15 转载在 其他  
字(3.1k)|赞(0)|评价(0)|浏览(334)

一、顺序表是什么?

顾名思义:顺序表就是一张连续的地址用来存储数据

  1. 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址
  2. 连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元
  3. 素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之
  4. 间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。

二、顺序表的特点

凡事都会有两面性,数据结构算法也不例外

2.1 优点:

1. 查找速度快,因为内存空间是连续的,所以找某个结点只需要通过计算即可直接找到
2. 尾插、尾删效率较高,因为有定义数组有效长度

2.2 缺点:

1. 删除效率低,当删除某一个元素时,这个元素后的所有元素都需要前移一位,需要大量的循环操作
2. 当线性表长度变化较大时,难以确定存储空间的容量

三、顺序表的实现

3.1 定义结构体

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //常量值
  4. #define MaxSize 50
  5. typedef int EleType;
  6. //结构体
  7. typedef struct {
  8. EleType data[MaxSize];//定义的数组,用来存元素
  9. int len;//当前顺序表中有多个个元素
  10. }List;

3.2 顺序表插入元素算法实现

  1. //插入元素
  2. bool Insert(List& list, int pos, EleType ele) {
  3. //防止插入位置不合理,禁止插入元素
  4. if (pos <= 0 || pos > list.len + 1) {
  5. return false;
  6. }
  7. //若线性表的当前存储长度>=线性表的总长度 不当存储
  8. if (list.len >= MaxSize) {
  9. return false;
  10. }
  11. //数据偏移
  12. for (int i = list.len; i >=pos; i--){
  13. list.data[i] = list.data[i - 1];
  14. }
  15. list.data[pos - 1] = ele;
  16. list.len++;
  17. return true;
  18. }

3.3 顺序表删除元素算法实现

  1. //删除元素
  2. bool Delete(List& list,int pos,EleType& ele) {
  3. //删除位置不合法
  4. if (pos<1 || pos>list.len) {
  5. return false;
  6. }
  7. //顺序表没有元素
  8. if (list.len==0) {
  9. return false;
  10. }
  11. //保存要删除位置的元素
  12. ele = list.data[pos - 1];
  13. //把删除位置后面的元素前移
  14. for (int i = pos; i <list.len;i++){
  15. list.data[i-1]=list.data[i];
  16. }
  17. list.len--;
  18. return true;
  19. }

3.4 顺序表修改元素算法实现

  1. //修改元素
  2. void Update(List& list,int pos,int number){
  3. list.data[pos-1] = number;
  4. }

3.5 顺序表查找元素算法实现

  1. //查找元素
  2. int Search(List list,int number) {
  3. for (int i = 0; i < list.len; i++){
  4. //匹配成功:返回查询元素的位置
  5. if (list.data[i]==number) {
  6. return i + 1;
  7. }
  8. }
  9. //匹配失败:返回-1
  10. return -1;
  11. }

3.6 打印顺序表

  1. //打印线性表
  2. void print(List& list) {
  3. for (int i = 0; i < list.len; i++){
  4. printf("%3d", list.data[i]);//将每一个元素打印出来
  5. }
  6. printf("\n");
  7. }

四 顺序表代码

所有的算法实现总归就是增删改查

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //常量值
  4. #define MaxSize 50
  5. typedef int EleType;
  6. //结构体
  7. typedef struct {
  8. EleType data[MaxSize];//定义的数组,用来存元素
  9. int len;//当前顺序表中有多个个元素
  10. }List;
  11. //插入元素
  12. bool Insert(List& list, int pos, EleType ele) {
  13. //防止插入位置不合理,禁止插入元素
  14. if (pos <= 0 || pos > list.len + 1) {
  15. return false;
  16. }
  17. //若线性表的当前存储长度>=线性表的总长度 不当存储
  18. if (list.len >= MaxSize) {
  19. return false;
  20. }
  21. //数据偏移
  22. for (int i = list.len; i >=pos; i--){
  23. list.data[i] = list.data[i - 1];
  24. }
  25. list.data[pos - 1] = ele;
  26. list.len++;
  27. return true;
  28. }
  29. //删除元素
  30. bool Delete(List& list,int pos,EleType& ele) {
  31. //删除位置不合法
  32. if (pos<1 || pos>list.len) {
  33. return false;
  34. }
  35. //顺序表没有元素
  36. if (list.len==0) {
  37. return false;
  38. }
  39. //保存要删除位置的元素
  40. ele = list.data[pos - 1];
  41. //把删除位置后面的元素前移
  42. for (int i = pos; i <list.len;i++){
  43. list.data[i-1]=list.data[i];
  44. }
  45. list.len--;
  46. return true;
  47. }
  48. //修改元素
  49. void Update(List& list,int pos,int number){
  50. list.data[pos-1] = number;
  51. }
  52. //查找元素
  53. int Search(List list,int number) {
  54. for (int i = 0; i < list.len; i++){
  55. //匹配成功:返回查询元素的位置
  56. if (list.data[i]==number) {
  57. return i + 1;
  58. }
  59. }
  60. //匹配失败:返回-1
  61. return -1;
  62. }
  63. //打印线性表
  64. void print(List& list) {
  65. for (int i = 0; i < list.len; i++){
  66. printf("%3d", list.data[i]);
  67. }
  68. printf("\n");
  69. }
  70. int main1() {
  71. List L;//定义要操作的顺序表
  72. bool falg;//查看返回值
  73. EleType ele;//用来存要删除的元素
  74. int pos;//查找元素返回元素的位置
  75. L.data[0] = 1;
  76. L.data[1] = 2;
  77. L.data[2] = 3;
  78. L.data[3] = 4;
  79. L.len = 4;
  80. //插入测试
  81. falg=Insert(L, 3, 10);
  82. print(L);
  83. if (falg) {
  84. printf("插入成功\n");
  85. }
  86. //删除测试
  87. Delete(L, 1, ele);
  88. printf("删除的元素是%d\n", ele);
  89. printf("删除后的线性表排序为");
  90. print(L);
  91. //查找测试
  92. pos=Search(L,100);
  93. printf("查找元素的位置为===>%d\n", pos);
  94. //修改测试
  95. Update(L, 3, 66);
  96. print(L);
  97. return 0;
  98. }

总结

后面会慢慢更新其他算法内容,纯手写,欢迎大家留言。

相关文章