删除后如何重新排列数组元素

时间:2015-12-28 05:22:23

标签: c arrays algorithm sorting

最近我正在阅读一本编程书,发现了这个问题:

我有一个数组:

  array = [2,3,6,7,8,9,33,22];

现在,假设我删除了4th位置的元素,即8

现在我必须将数组重新排列为:

  Newarray = [2,3,6,7,9,33,22];

我该怎么做?我还必须尽量减少复杂性。

编辑我别无选择再制作它。我只需修改它。

3 个答案:

答案 0 :(得分:2)

您可以通过简单地通过下一个元素复制元素来“删除”数组中的值,这对memmove很容易:

int array[8] = {2,3,6,7,8,9,33,22};
memmove(&array[4], &array[5], sizeof(int) * 3);

结果数组为{2,3,6,7,9,33,22,22}

从中您可以看到尝试从编译时数组中“删除”元素时遇到的一个大问题: 无法

您可以覆盖元素,但数组的大小在编译时是固定的,并且在运行时实际上无法更改。

一种常见的解决方案是手动跟踪数组中有效元素的实际数量,并确保在添加或删除元素时更新该大小。或者将未使用的元素设置为不会被使用的值(例如,如果您的数组只能包含正数,那么您可以将未使用的元素设置为-1并检查)。

如果你不想使用库函数(为什么不?),那么循环并设置例如。

array[4] = array[5];
array[5] = array[6];

等等。

答案 1 :(得分:1)

这样做,只需使用这两个功能就可以正常使用

index=4;//You wanted to delete it from the array.
memcpy(newarray,array,sizeof(array));
memmove(&newarray[index], &newarray[index + 1], sizeof(newarray)-1);

现在newarray包含您确切的副本而没有您想删除的字符

答案 2 :(得分:1)

您可以简单地将delIdx(删除索引)中的每个元素向前移一步。

for(int i=delIdx; i<(arr_size-1);i++)
{
    arr[i]= arr[i+1];
}

如果需要,您可以将最后一个元素设置为不可达到的值,或者减小数组的大小。