将元素插入数组C

4

我有一个已经排序的数字数组,所以不需要再进行排序,我需要在数组中插入一个给定值,命名为val,并且要插入到一个有效的位置。

我的程序可以处理给定值小于最后一个元素的情况,但是当给定值大于最后一个元素时,程序就无法插入该值。

例如,对于数组{1, 2, 3, 4, 6}和值5,数组应该是{1, 2, 3, 4, 5, 6},但对于值7,我的数组看起来像{1, 2, 7, 4, 6, 0}

#include <stdio.h>

void insert(int val, int *n, int v[])
{
    int index;
    index = n - 1;
    if (n == 0)
    {
        v[0] = val; // check if array is empty
        n = n + 1; // v[0] becomes the given value
    }              // increase size of array
    if (val > v[index])
    {
        v[index+1] = val; // given value is bigger than the last value in array
        n = n + 1; // increase size
    }
    else
    {
        while (index >= 0 && v[index] > val)
        {
            v[index+1] = v[index]; //shift items to the right
            index--;
        }

        v[index + 1] = val; //after moving elements to the right
        n = n + 1;   // i set the value to the valid position
    }
}

void display(int n, int v[])
{
    int i;
    for (i = 0;i < n; i++)
        printf("%d ", v[i]);
}

int main(void)
{
    int v[10] = { 12, 23, 34, 41, 69, 71, 81, 91, 100 };
    int n;
    n = 9; // size of array
    insert(101,n,v); // 101 is given value to insert
    display(n,v);
    return 0;
}

为什么n参数是int*而不是int - caylee
int *n ... int index = n - 1; 在一个开启了警告的编译器上会引发警告。节省时间,避免尴尬,开启警告。 - chux - Reinstate Monica
我需要将N与插入后增加的值一起传递给打印数组的显示函数,尽管它在我的电脑上显示警告,但我仍在努力理解指针。 - Julanu
1个回答

3

您有几个错误:

  1. 您传递的是int而不是int *,因此无法更新数组大小
  2. 您没有在数组中正确地放置值

这是您的代码应该如何编写:

#include <stdio.h>

void insert(int val, int *nPtr, int v[]);
void display(int n, int v[]);

int main(void) {
  int v[10] = {12, 23, 34, 41, 69, 71, 81, 91, 100};
  int n;
  n = 9;
  insert(101, &n, v);
  display(n, v);
  return 0;
}

void insert(int val, int *nPtr, int v[]) {
  int n = *nPtr;
  int i, j;
  int k = 0;

  for (i = 0; i < n + 1; i++)
    if (!k) {
      if (v[i] > val || i == n) {
        for (j = n - 1; j >= i; j--) {
          v[j + 1] = v[j];
        }

        v[i] = val;
        n++;

        k = 1;
      }
    }

  *nPtr = n;
}

void display(int n, int v[]) {
  int i;
  for (i = 0; i < n; i++)
    printf("%d ", v[i]);
  printf("\n");
}

您也可以尝试在开头插入数字,例如0,它仍然有效。


谢谢!现在我知道如何使用指针传递值了。但是我会坚持我的代码并尝试改进它,因为我需要覆盖所有可能的情况,并且我测试了你的代码,对于值为0的情况,小于数组的第一个元素,数组看起来像{0, 23, 23, ...., 23}。你的代码确实比我的写得好,我不能否认,至于BREAK; 我不允许在我的大学入学考试中使用它,所以我倾向于避免使用它,但是谢谢!你帮了我很多。 - Julanu
1
@MariusJula。我不知道你不能使用break。另外,感谢您提到我的代码有一个错误。我已经修复了它并删除了break,现在它适用于所有情况。 - dhDPfKCfJdU4JIW4Sc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接