如何在c中插入一个从数组开头开始迭代的元素?
How to insert an element starting the iteration from the beginning of the array in c?
我看到从后端开始迭代时在数组中插入元素。但是我想知道是否可以从前面插入
终于想到办法了,上代码
#include <stdio.h>
int main()
{
int number = 5; //element to be inserted
int array[10] = {1, 2, 3, 4, 6, 7, 8, 9};
int ele, temp;
int pos = 4; // position to insert
printf("Array before insertion:\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
puts("");
for (int i = pos; i < 10; i++)
{
if (i == pos) // first element
{
ele = array[i + 1];
array[i + 1] = array[i];
}
else // rest of the elements
{
temp = array[i + 1];
array[i + 1] = ele;
ele = temp;
}
}
array[pos] = number; // element to be inserted
printf("Array after insertion:\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
输出如下:
Array before insertion:
1 2 3 4 6 7 8 9 0 0
Array after insertion:
1 2 3 4 5 6 7 8 9 0
在 C 中,数组具有基于第一个元素的地址(又名指针)的“本机”内置实现和用于元素寻址的 []
运算符。
分配数组后,不会自动处理或检查其实际大小:代码需要确保边界未被侵入。
此外,在 C 中,任何变量都没有默认值(又名 empty),其中包括数组和数组元素。
不过,在 C 中没有像 insertion、appending 或 removal 这样的东西的一个数组元素。您可以使用 []
运算符简单地引用第 n 个(n
从 0
开始)数组元素。
所以,如果你有一个数组,你不能在它的第 n 个位置 insert 一个新项目。您只能读取或(覆盖)写入它的任何项目。
任何其他操作,如插入或删除,都需要临时代码,这些代码基本上可以归结为向前移动数组元素(为插入腾出空间)或向后移动(为 删除 一)。
这是 C 语言的特性,不应被视为限制:任何其他允许这些数组操作的语言都必须具有较低级别的隐藏实现或非平凡的数据结构来实现数组。
这意味着,在 C 中,虽然将内存使用量保持在最低限度,但这些数组操作需要一些耗时的实现,例如项目移位操作。
然后,您可以权衡内存使用量与时间使用量,并通过使用例如单链表和双链表 link 来提高整体效率。您为 link 指针丢失了一些内存,以支持更快的插入广告删除操作。这主要取决于实施目标。
最后,要回答最初的问题,实际答案需要一些关于内存与时间权衡的额外细节,可以通过这些细节来实现目标。
@Krishna Acharya 描述的解决方案是一个简单的基于移位的解决方案,没有边界检查。一个非常简单且有点幼稚的实现。
最后一点。 Krishna 代码在数组末尾显示的 0
s 应被视为仅仅是随机值。正如我之前所说,没有默认值。
代码应该改为:
int array[10] = {1, 2, 3, 4, 6, 7, 8, 9, 0, 0};
为了确保最后两个数组元素的任何未使用值为0
。
我看到从后端开始迭代时在数组中插入元素。但是我想知道是否可以从前面插入
终于想到办法了,上代码
#include <stdio.h>
int main()
{
int number = 5; //element to be inserted
int array[10] = {1, 2, 3, 4, 6, 7, 8, 9};
int ele, temp;
int pos = 4; // position to insert
printf("Array before insertion:\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
puts("");
for (int i = pos; i < 10; i++)
{
if (i == pos) // first element
{
ele = array[i + 1];
array[i + 1] = array[i];
}
else // rest of the elements
{
temp = array[i + 1];
array[i + 1] = ele;
ele = temp;
}
}
array[pos] = number; // element to be inserted
printf("Array after insertion:\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
输出如下:
Array before insertion:
1 2 3 4 6 7 8 9 0 0
Array after insertion:
1 2 3 4 5 6 7 8 9 0
在 C 中,数组具有基于第一个元素的地址(又名指针)的“本机”内置实现和用于元素寻址的 []
运算符。
分配数组后,不会自动处理或检查其实际大小:代码需要确保边界未被侵入。
此外,在 C 中,任何变量都没有默认值(又名 empty),其中包括数组和数组元素。
不过,在 C 中没有像 insertion、appending 或 removal 这样的东西的一个数组元素。您可以使用 []
运算符简单地引用第 n 个(n
从 0
开始)数组元素。
所以,如果你有一个数组,你不能在它的第 n 个位置 insert 一个新项目。您只能读取或(覆盖)写入它的任何项目。
任何其他操作,如插入或删除,都需要临时代码,这些代码基本上可以归结为向前移动数组元素(为插入腾出空间)或向后移动(为 删除 一)。 这是 C 语言的特性,不应被视为限制:任何其他允许这些数组操作的语言都必须具有较低级别的隐藏实现或非平凡的数据结构来实现数组。
这意味着,在 C 中,虽然将内存使用量保持在最低限度,但这些数组操作需要一些耗时的实现,例如项目移位操作。 然后,您可以权衡内存使用量与时间使用量,并通过使用例如单链表和双链表 link 来提高整体效率。您为 link 指针丢失了一些内存,以支持更快的插入广告删除操作。这主要取决于实施目标。
最后,要回答最初的问题,实际答案需要一些关于内存与时间权衡的额外细节,可以通过这些细节来实现目标。
@Krishna Acharya 描述的解决方案是一个简单的基于移位的解决方案,没有边界检查。一个非常简单且有点幼稚的实现。
最后一点。 Krishna 代码在数组末尾显示的 0
s 应被视为仅仅是随机值。正如我之前所说,没有默认值。
代码应该改为:
int array[10] = {1, 2, 3, 4, 6, 7, 8, 9, 0, 0};
为了确保最后两个数组元素的任何未使用值为0
。