用于在C中的已排序数组中插入元素的函数

时间:2014-04-01 18:38:31

标签: c arrays function

我是C的新手,正在编写一个函数来将元素插入到排序列表中。但我的代码没有正确显示最后一位数字。虽然我知道有多种方法可以纠正它,但我想知道为什么我的代码不起作用,这里是代码

#include <stdio.h>
int insert(int array[],int val);
int main (void)
{
  int arr[5],j;
  for (j = 0; j<5; j++)
  {
    scanf("%d",&arr[j]);
  }

  insert(arr,2);
  for(j = 0;j<6;j++)
    printf("%d",arr[j]);
return(0);
}
int insert(int array[],int val)
{
  int k,i;
  for (k = 0;k<5;k++)
    if(val<array[k])

    break;

  for (i = 4; i>=k;i--)
  {
    array[i+1] = array[i];

  }
  array[k] = val;

  return(1);

}

4 个答案:

答案 0 :(得分:3)

你在这里写出数组的范围:

for (i = 4; i>=k;i--)
{
    array[i+1] = array[i];

i+1 == 5和你的数组的范围是0 ... 4

然后你尝试打印数组,但你再次出界:

for(j = 0;j<6;j++)
    printf("%d",arr[j]);

首先确保您的阵列足够大。

答案 1 :(得分:0)

当你为一个插入元素的函数提供一个static / auto数组时,你必须给出:Address,Valid length和Buffer Space,除非保证足够大。

当给出一个动态分配的数组时,你必须给出指针和有效长度,你可以给出缓冲区空间或保证留下足够的空间以避免重新分配。

否则,您冒着缓冲区溢出的风险,UB意味着可能发生任何事情,如您的示例所示。

答案 2 :(得分:0)

你试图让arr [6]从arr [5]中添加一个val - 在C中使用静态分配的数组是不可能的。 要完成您尝试做的事情,您需要使用动态数组分配:

int *arr;
int N = 5;
arr = (int *)malloc(N*sizeof(int));

然后你使用这个arr [5]的方式与通过scanf加载数据一样。 稍后,在为数组添加额外值时 - 您需要重新分配您的arr以使其更大(阅读malloc / realloc C函数):

arr = (int *)realloc((N+1)*sizeof(int));

现在你的arr是6 int-s大小。 不幸的是,如果您不知道数组大小(元素数量),则需要在C中处理动态内存分配。

不要忘记在main()函数的末尾释放该内存:

free(arr); 

答案 3 :(得分:0)

在数组中插入一个新元素时,必须将数组大小从5增加到6,因此应该有一些空间。

int arr [6];

您还可以在下面的链接中找到更多信息: https://learndswithvishal.blogspot.com/2020/06/insert-element-in-sorted-array.html