我将读取用户的几个值并将其存储在数组中。然后我需要创建一个足以存储所有这些值的数组。使用我编写的一些函数,我通过数组对给定值进行sort / lsearch / bsearch。
我已经编写了我的程序和所有内容,但是对于静态数组实现。我对实际使用动态数组的位置感到困惑。
当用户开始输入值时使用它是有意义的,因为我无法假设他输入了多少值,因此数组需要足够大以容纳它。当我创建一个可以容纳所有值的足够大的数组(作为第一个数组的副本)时,使用它也是有道理的(排序)。
我不是要求任何代码,一切都已完成但是采用静态方法。我只想在这里想象我需要在哪里使用darrays。我的想法是:
我对此是对还是错?
答案 0 :(得分:1)
首先使用malloc
或calloc
分配一些已知起始大小的数组,并跟踪变量中的当前容量。
当您正在读取值时,如果您的数组不够大,那么用户realloc
可以将数组的大小加倍。
答案 1 :(得分:0)
我想你提出了错误的问题。
问题是:
动态数组(连续的内存块)是保存和处理应用程序中数据的正确数据结构吗?
数组只有一个特别有用的应用程序,它是关联数组,这意味着数组索引本身具有意义,可以用来检索正在搜索的正确内容,并努力使用O(1)。
在示例中,轨道运行器列表可以存储在数组中,其中数组索引等于轨道号。如果您想要显示每个轨道的跑步者名称,这是一个完美的数据结构。如果你想按字母顺序对所有参赛者的名字进行排序,这是一个糟糕的数据结构。
但是根据你的应用程序描述,数组索引对你没有意义。这表明阵列不是最佳选择。
答案 2 :(得分:0)
最好的解决方案是每次用户输入值时都不要复制整个数组。对malloc和free的要求会很高,而对于更大的阵列则会变得更糟。
您需要使用“元素数量作为输入
来计算数组的大小int * array = newArray(10);
int * newArray(int size){ return malloc(size * sizeof(int)); }
请注意,int*
是一个数组,因此您仍然可以执行array[3]
。但是,如果您集中存储已使用元素的数量和当前大小,则可以分配一些元素,并且只在可用元素耗尽时才会增长。
struct DynamicIntArray {
int used;
int size;
int* storage
};
void add(struct DynamicArray* array, int value) {
if (used < size) {
(*array).storage[used] = value;
used++;
} else {
int newSize = size+10;
int* newStorage = (int*)malloc(newSize*sizeof(int));
int* oldStorage = (*array).storage;
for (int i = 0; i < size; i++) {
newStorage[i] = oldStorage[i];
}
(*array).storage = newStorage;
(*array).size = newSize;
free(oldStorage);
}
}
有这样一个例子。您应该能够编写newDynamicIntArray(...)
函数和freeDynamicIntArray(struct DynamicIntArray* array)
函数以及您关注的任何其他方法。
答案 3 :(得分:0)
如果您不确定在运行时插入了多少条目,我建议您使用链表数据结构。它会节省你的内存使用量。