当前位置:   article > 正文

c实现顺序表

c实现顺序表

 目录

  c语言实现顺序表

完整代码实现


 c语言实现顺序表

顺序表的结构定义:

  1. typedef struct vector
  2. {
  3. int size; // 顺序表的容量
  4. int count; // 顺序表现在存储了多少个数据
  5. int *data; // 指针指向连续的整型存储空间
  6. } vector;

顺序表的结构操作:

1、初始化顺序表

  1. vector *getNewVector(int n) // 获取一个存储上限为n的顺序表
  2. {
  3. vector *p = (vector *)malloc(sizeof(vector)); // 为顺序表结构体动态开辟空间
  4. p->size = n; // 上限
  5. p->count = 0; // 存储个数初始化为0
  6. p->data = (int *)malloc(sizeof(int *) * n); // 指针指向连续的存出区
  7. return p;
  8. }

2、销毁顺序表

  1. void clear(vector *v)
  2. {
  3. if (v == NULL)
  4. return; // 如果没有顺序表则返回
  5. free(v->data); // 先销毁连续的存储区
  6. free(v); // 再销毁顺序表本身的存储空间
  7. return;
  8. }

3、插入数据

  1. int insert(vector *v, int pos, int value) // 在pos位置插入
  2. {
  3. if (pos < 0 || pos > v->count)
  4. return 0; // 插入位置合不合法
  5. // if (v->size == v->count)
  6. // return 0;
  7. if(v->size == v->count && !expand(v)) return 0; // 判断表是否满了
  8. for (int i = v->count - 1; i >= pos; i--) // 逆序遍历,后移
  9. {
  10. v->data[i + 1] = v->data[i];
  11. }
  12. v->data[pos] = value; // 插入
  13. v->count += 1; // 维护数据
  14. return 1;
  15. }

4、删除数据

  1. int erase(vector *v, int pos) // 在pos位置删除数据
  2. {
  3. if (pos < 0 || pos >= v->count)
  4. return 0; // 删除位置合法不
  5. if (v->count == 0)
  6. return 0; // 无数据
  7. for (int i = pos + 1; i < v->size; i++) // 前序遍历,前移
  8. {
  9. v->data[i - 1] = v->data[i];
  10. }
  11. v->count -= 1; // 维护数据
  12. return 1;
  13. }

5、输出数据

  1. // 5、输出数据
  2. void output_vector(vector *v)
  3. {
  4. int len = 0;
  5. for (int i = 0; i < v->size; i++)
  6. {
  7. len += printf("%3d", i);
  8. }
  9. printf("\n");
  10. for (int i = 0; i < len; i++)
  11. printf("-");
  12. printf("\n");
  13. for (int i = 0; i < v->count; i++)
  14. {
  15. printf("%3d", v->data[i]);
  16. }
  17. printf("\n");
  18. printf("\n");
  19. return;
  20. }

6、扩容数据

注意:

        realloc的三种工作方式

        1、试着在原内存的基础上向后延展内存空间

        2、当后面的内存不够用了,会重新找一块内存将原来的复制过来然后向后延展

        3、若重新找的内存没有足够大的,就返回NULL。

  1. int expand(vector* v)
  2. {
  3. if(v == NULL) return 0;
  4. int * p = (int *)realloc(v->data,sizeof(int) * 2 * v->size);
  5. //为了避免realloc工作原理产生的bug,先定义一个指针,先给这个指针赋予realloc
  6. if( p == NULL) return 0; //若p返回NULL,则扩容空间失败 返回就可以了
  7. v->data = p;
  8. v->size *= 2;
  9. return 1;
  10. }

完整代码实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. // 顺序表 结构定义
  5. typedef struct vector
  6. {
  7. int size; // 顺序表的容量
  8. int count; // 顺序表现在存储了多少个数据
  9. int *data; // 指针指向连续的整型存储空间
  10. } vector;
  11. // 顺序表 结构操作
  12. // 1、初始化顺序表
  13. vector *getNewVector(int n) // 获取一个存储上限为n的顺序表
  14. {
  15. vector *p = (vector *)malloc(sizeof(vector)); // 为顺序表结构体动态开辟空间
  16. p->size = n; // 上限
  17. p->count = 0; // 存储个数初始化为0
  18. p->data = (int *)malloc(sizeof(int *) * n); // 指针指向连续的存出区
  19. return p;
  20. }
  21. // 2、销毁顺序表
  22. void clear(vector *v)
  23. {
  24. if (v == NULL)
  25. return; // 如果没有顺序表则返回
  26. free(v->data); // 先销毁连续的存储区
  27. free(v); // 再销毁顺序表本身的存储空间
  28. return;
  29. }
  30. //6、扩容
  31. int expand(vector* v)
  32. {
  33. if(v == NULL) return 0;
  34. int * p = (int *)realloc(v->data,sizeof(int) * 2 * v->size);
  35. if( p == NULL) return 0;
  36. v->data = p;
  37. v->size *= 2;
  38. return 1;
  39. }
  40. // 3、插入
  41. int insert(vector *v, int pos, int value) // 在pos位置插入
  42. {
  43. if (pos < 0 || pos > v->count)
  44. return 0; // 插入位置合不合法
  45. // if (v->size == v->count)
  46. // return 0;
  47. if(v->size == v->count && !expand(v)) return 0; // 判断表是否满了
  48. for (int i = v->count - 1; i >= pos; i--) // 逆序遍历,后移
  49. {
  50. v->data[i + 1] = v->data[i];
  51. }
  52. v->data[pos] = value; // 插入
  53. v->count += 1; // 维护数据
  54. return 1;
  55. }
  56. // 4、删除
  57. int erase(vector *v, int pos) // 在pos位置删除数据
  58. {
  59. if (pos < 0 || pos >= v->count)
  60. return 0; // 删除位置合法不
  61. if (v->count == 0)
  62. return 0; // 无数据
  63. for (int i = pos + 1; i < v->size; i++) // 前序遍历,前移
  64. {
  65. v->data[i - 1] = v->data[i];
  66. }
  67. v->count -= 1; // 维护数据
  68. return 1;
  69. }
  70. // 5、输出数据
  71. void output_vector(vector *v)
  72. {
  73. int len = 0;
  74. for (int i = 0; i < v->size; i++)
  75. {
  76. len += printf("%3d", i);
  77. }
  78. printf("\n");
  79. for (int i = 0; i < len; i++)
  80. printf("-");
  81. printf("\n");
  82. for (int i = 0; i < v->count; i++)
  83. {
  84. printf("%3d", v->data[i]);
  85. }
  86. printf("\n");
  87. printf("\n");
  88. return;
  89. }
  90. int main(void)
  91. {
  92. srand(time(0)); //实现随机数
  93. #define MAX_OP 10
  94. vector *v = getNewVector(2);
  95. for (int i = 0; i < MAX_OP; i++)
  96. {
  97. int op = rand() % 4, pos, val, ret;
  98. switch (op)
  99. {
  100. //75% 插入
  101. case 0:
  102. case 1:
  103. case 2:
  104. pos = rand() % (v->count + 2); //随机位置
  105. val = rand() % 100; //随机值
  106. ret = insert(v, pos, val); //插入 为 1 ; 删除 为 0
  107. printf("insert %d at %d to vector = %d\n",
  108. val, pos, ret);
  109. break;
  110. //25% 删除
  111. case 3:
  112. pos = rand() % (v->count + 2);
  113. ret = erase(v, pos);
  114. printf("erase item at %d in vector = %d\n",
  115. pos, ret);
  116. break;
  117. }
  118. output_vector(v);
  119. }
  120. clear(v); //销毁表
  121. return 0;
  122. }

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

闽ICP备14008679号