C动态数组中间插入

标签 c arrays element

嘿嘿。在我的 C 程序中,我正在处理许多操作,在这些操作中我必须读取文件并将其数据存储在数组中。为此,由于 C 中的数组处理有点复杂,我使用了这篇文章中建议的以下代码:C dynamically growing array

typedef struct {
    float *array;
    size_t used;
    size_t size;
} points;

void initArrayInd(arrayInd *a, size_t initialSize) {
    a->array = (GLubyte *)malloc(initialSize * sizeof(GLubyte));
    a->used = 0;
    a->size = initialSize;
}

void insertArrayInd(arrayInd *a, GLubyte element) {
    if (a->used == a->size) {
        a->size *= 2;
        a->array = (GLubyte *)realloc(a->array, a->size * sizeof(GLubyte));
    }
    a->array[a->used++] = element;
}

void freeArrayInd(arrayInd *a) {
    free(a->array);
    a->array = NULL;
    a->used = a->size = 0;
}

我习惯于 Java 编程,所以在大多数情况下,我认为应该如何编写代码的方式是错误的。我想基于这个动态数组分配,能够创建一个新函数,在我指定的位置插入一条记录。我想知道这样做的最佳方法是什么。

我应该在数组末尾插入新记录,然后将所有内容移动一个位置吗?我应该创建一个新数组,复制 i-1 元素,然后放置 i 并复制 i+n 元素。我是否应该将初始数组分成两个,创建第​​三个并将所有内容混合在一起。在 C 中实现这一目标的最佳方式是什么?

编辑:这样可以吗?

void insertFPointsAt(points *a, float element, int position) {
    if (a->used == a->size) {
        a->size *= 2;
        a->array = (float *)realloc(a->array, a->size * sizeof(float));
    }
    memmove(&a->array[position], &a->array[position+1], &a->array[a->used] - &a->array[position]);
    a->array[position] = element;
}

最佳答案

在数组中间插入时,需要实现这个算法:

  • 检查是否有足够的空间放置要插入的元素
  • 如果没有足够的空间,按照在末尾添加元素时的方式扩展数组
  • 使用 memmove 将数据向上移动一位
  • 将元素放在调用者要求的位置

与最后插入不同的唯一步骤是第三步,您将数组的内容向上移动一个元素。即使两个区域重叠,memmove 函数也能正确处理此问题。

编辑 memmove 调用应该如下所示:

memmove(&a->array[position+1], &a->array[position], &a->array[a->used] - &a->array[position]);

一些附加说明:

  • 在释放数组后将数组增加到两倍大小将不起作用,因为您将大小设置为零。
  • 与需要转换 malloc 的 C++ 不同,C 不需要转换 malloc/calloc/重新分配

关于C动态数组中间插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16267388/

相关文章:

c - Rand() 不在 C 中生成随机变量

c++ - 当我超出数组时,Netbeans 不会给出段错误

c - 将一个数组中的元素移动/移除到另一个数组中

c - 我的代码似乎在结束之前没有运行

c - 递归地反转链表

c - 2Darray 中的第二个标签 [1st][2nd] 含义是什么,例如 .char label[11][6]

c++ - 通过指针将 char 数组传输到另一个临时数组指针

android - 解析json对象和数组android

list - 从给定索引和多个元素的列表创建子列表。序言

javascript - 如何使用 javascript 返回 DOM 元素的 id,而不是元素的值