需要有关代码段的建议

时间:2010-10-03 03:09:30

标签: c algorithm

我写了一个“插入”函数来将整数插入到整数数组中。它有效,但我不知道它是否是最好的算法。

这是我的代码:

int* insert(int *dest, size_t len, unsigned int index, int value)
{
int x = 0, i = 0;
int *stackp = calloc(len+1, sizeof(int));

if(index > (len-1)) return dest;

while(x < len) {
    if(x == index) {
        ++x;
    } else {
        *(stackp+x) = *(dest+i);
        ++x, ++i;
    }
}

*(stackp+index) = value;
free(dest);
dest = stackp;

return dest;

}

2 个答案:

答案 0 :(得分:5)

您的内存分配存在重大错误。 stackp是一个自动(堆栈)数组,这意味着它的生命周期在插入返回后立即结束。您必须使用其他分配方法。您可以让调用者分配一个新数组并传入两个指针,或者您可以使用malloc自己完成(不要忘记免费)。

然而,其余的看起来都很好。这几乎是非就地插入的唯一算法。使用特殊技巧(例如,一次复制两个整数),您可以更快地完成它。 memmovememcopy可能会在某些体系结构上使用此类优化。

此外,许多算法会在找到位置时写入stackp[index],而不是在结尾时写入realloc。但核心算法基本相同。

另一种方法是就地插入(仅在插入位置后移动元素),而不是使用新数组。您经常会使用malloc进行扩展。在许多情况下这是首选,因为它可以节省复制时间并避免{{1}}新的内存位置(也可能使堆碎片化)。

最后,替代数据结构完全是链表。这完全消除了复制元素的需要,但使用更多内存并防止随机访问。

答案 1 :(得分:2)

这里有一个严重的错误。数组stackp是一个局部变量,您将返回它作为结果。如果要在“插入”功能之外再次读取/写入该数组,则可能会出现分段错误。

要纠正它,您需要分配一个动态数组,如:

int *stackp;

stackp = (int*)malloc(size(int)*(len+1));