• 【学习记录】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。用C语言编写


    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. // 我的代码所犯的错误记录:
    6. // 1. \n的换行打成了/n导致程序迟迟不能换行
    7. // 2. rand()%4,是随机0~3的随机数,并不是0~4
    8. // 3. 在main主函数中,首先声明int pos, val;如果在下方执行函数继续声明int pos, val;会导致变量初始化,从而使int pos, val这两个变量再次刷新,导致随机插入值不对
    9. // 4. for循环的使用规则,内部变量i必须初始化为int类型,不然会报错
    10. // 定义自定义结构体 vector,用于模拟动态数组
    11. typedef struct vector
    12. {
    13. int size; // 数组容量
    14. int count; // 数组元素数量
    15. int* data; // 指向数据的指钨
    16. } vector;
    17. // 创建一个新的 vector,n 表示初始容量
    18. vector* getNewvector(int n) {
    19. vector* p = (vector*)malloc(sizeof(vector)); // 分配 vector 结构体内存
    20. p->size = n;
    21. p->count = 0; // 初始化元素数量为 0
    22. p->data = (int*)malloc(sizeof(int) * n); // 分配数据存储内存
    23. return p;
    24. }
    25. // 扩展 vector 的容量
    26. int expand(vector* v) {
    27. if (v == NULL) return 0; // 检查传入参数是否为空
    28. int* p = (int*)realloc(v->data, sizeof(int) * 2 * v->size); // 重新分配内存为原来的两倍
    29. if (p == NULL) return 0; // 检查内存分配是否成功
    30. v->data = p;
    31. v->size *= 2;
    32. return 1;
    33. }
    34. // 插入元素到指定位置
    35. int insert(vector* v, int pos, int val) {
    36. if (pos < 0 || pos > v->count) return 0; // 检查插入位置是否有效
    37. if (v->size == v->count && !expand(v)) {
    38. return 0; // 检查容量是否足够,不足则扩展失败返回0
    39. }
    40. for (int i = v->count - 1; i >= pos; i--){
    41. v->data[i + 1] = v->data[i]; // 将元素后移
    42. }
    43. v->data[pos] = val; // 插入新元素
    44. v->count += 1; // 增加元素数量
    45. return 1;
    46. }
    47. // 清空 vector,释放内存
    48. void clear(vector *v){
    49. if (v == NULL) return;
    50. free(v->data);
    51. free(v);
    52. return;
    53. }
    54. // 输出 vector 中的内容
    55. void output_vector(vector* v){
    56. int len = 0;
    57. for(int i = 0; i < v->size; i++){
    58. len += printf("%3d", i);
    59. }
    60. printf("\n");
    61. for (int i = 0; i < len; i++){ printf("-"); }
    62. printf("\n");
    63. for (int i = 0; i < v->count; i++) {
    64. printf("%3d", v->data[i]);
    65. }
    66. printf("\n\n");
    67. return;
    68. }
    69. // 删除指定位置的元素
    70. int erase(vector* v, int pos) {
    71. if (pos < 0 || pos >= v->count) return 0; // 检查删除位置是否有效
    72. for (int i = pos + 1; i < v->count; i++) {
    73. v->data[i - 1] = v->data[i]; // 将元素前移
    74. }
    75. v->count -= 1; // 减少元素数量
    76. return 1;
    77. }
    78. int main() {
    79. srand(time(0)); // 使用当前时间作为随机数种子
    80. #define MAX_OP 20
    81. vector* v = getNewvector(2); // 创建一个初始容量为2的 vector
    82. for (int i = 0; i < MAX_OP; i++) {
    83. int op = rand() % 4, pos, val, ret; // 随机生成操作类型,位置,值
    84. switch (op)
    85. {
    86. case 0:
    87. case 1:
    88. case 2:
    89. pos = rand() % (v->count+2); // 随机生成插入位置
    90. val = rand() % 100; // 随机生成插入值
    91. ret = insert(v, pos, val); // 插入操作
    92. printf("insert %d at %d to vector = %d\n",val, pos, ret);
    93. break;
    94. case 3:
    95. pos = rand() % (v->count + 2); // 随机生成删除位置
    96. ret = erase(v, pos); // 删除操作
    97. printf("erase item at %d in vector = %d\n", pos, erase(v, pos));
    98. break;
    99. }
    100. output_vector(v); // 输出当前 vector 内容
    101. }
    102. clear(v); // 清空 vector 并释放内存
    103. return 0;
    104. }

    这段代码实现了一个简单的动态数组(vector)数据结构,允许用户插入和删除元素,以及动态扩展数组的容量。以下是这段代码的主要功能:

    1. 结构体定义:

      • 定义了一个名为 vector 的结构体,包含了三个成员:
        • size:表示数组的容量。
        • count:表示数组中实际存储的元素数量。
        • data:是一个指向整数的指针,用于存储实际数据。
    2. 函数定义:

      • getNewvector(int n):用于创建一个新的 vector 对象,初始容量为 n。
      • expand(vector* v):扩展 vector 的容量,使其容量变为原来的两倍。
      • insert(vector* v, int pos, int val):在指定位置插入一个值为 val 的元素。
      • clear(vector *v):释放 vector 对象占用的内存,包括数据数组和 vector 结构体本身。
      • output_vector(vector* v):以漂亮的格式输出 vector 中的内容。
      • erase(vector* v, int pos):删除指定位置的元素。
    3. 主函数 main

      • 使用 srand(time(0)) 初始化随机数种子,以确保随机数的不同性。
      • 创建一个名为 v 的 vector 对象,初始容量为 2。
      • 通过循环模拟进行一系列操作,最多执行 20 次。操作类型为随机选择,包括插入元素和删除元素。
      • 随机生成操作类型和操作位置,然后调用相应的函数进行插入或删除操作。
      • 每次操作后,输出当前 vector 的内容。
      • 最后,通过 clear(v) 清空 vector 对象并释放内存。

    这段代码主要用于演示一个基本的动态数组的实现,以及如何进行插入和删除操作。在主函数中,通过随机操作来测试这些功能,以及展示 vector 内容的输出。

  • 相关阅读:
    2024全国水科技大会暨水环境新污染物控制青年学者论坛
    【k8s】K8S中的cordon、uncordon和drain 冻结节点、驱离pod
    JS生成器的介绍
    为什么vscode更新不成功,系统找不到指定路径
    学到一招 chrome 浏览器 debug 悬浮样式
    Linux CP文件夹略过目录的解决
    发现流程任务的提交时间不对,@JsonFormat时间格式及时区问题
    MSSQL有关数据库、表的循环操作可使用的存储过程 sp_MSforeachdb 及 sp_MSforeachtable
    卡奥斯第二届1024程序员节正式启动!
    elasticSearch的索引库文档的增删改查
  • 原文地址:https://blog.csdn.net/dsafefvf/article/details/133908902