【问题标题】:Insert element into array C将元素插入数组 C
【发布时间】:2017-11-06 18:17:49
【问题描述】:

我有一个之前已排序的数字数组,因此无需对其进行排序,我需要在我的数组中的有效位置插入一个给定的值,命名为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
  • int *n ... int index = n - 1; 会在启用良好的编译器上发出警告。节省时间、避免尴尬并启用警告。
  • 在插入到打印数组的显示函数后,我需要将 N 与增加的值一起传递,它确实在我的计算机上显示了警告,但我仍在努力解决指针

标签: c arrays insert


【解决方案1】:

你有几个错误:

  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;我不允许在我的大学入学考试中使用它,所以我倾向于避免使用它,但是谢谢!你帮了大忙。
  • @MariusJula。我不知道你不允许使用break。另外,感谢您提到我的代码有错误。我修复了它并删除了break,它现在适用于所有情况。
猜你喜欢
  • 2017-12-13
  • 2019-03-08
  • 1970-01-01
  • 2023-03-26
  • 2018-02-04
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多