【问题标题】:Array remove all elements with value input by user [duplicate]数组删除用户输入值的所有元素[重复]
【发布时间】:2017-02-08 13:45:17
【问题描述】:

我有以下数组,删除用户输入的所有元素的算法是什么?

eg.int arr[size]={12,10,7,43,12,12,26,83};

如果我想删除 12 所以输出应该是这样的:

{10,7,43,26,83}

【问题讨论】:

  • 您无法调整 VLA 的大小。
  • “删除”是什么意思?
  • 因此不能从数组中删除元素,但可以替换现有元素。一种方法可能是拥有一个临时数组,复制除要从原始数组中删除的元素之外的所有元素。然后将临时数组复制回原数组。
  • @Zinov 除了标题,这个问题很混乱。在我看来,这不是一个好的规范副本。
  • 不管怎样,如果你需要经常添加/删除项目,你会使用链表而不是数组。这就是链表存在的原因。

标签: c arrays algorithm


【解决方案1】:

从技术上讲,您不能从数组中删除元素。数组的大小是固定的,一旦设置就无法更改。

可能的解决方案是使用特殊值来标记数组中的“空”元素。或者将未删除的数据复制到另一个数组。或者跟踪数组的当前“大小”(“活动”元素的数量)并移动元素,使它们始终位于数组的“前面”。

【讨论】:

    【解决方案2】:

    这是最直接的解决方案:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      const int size = 8;
      int arr[size] = { 12, 10, 7, 43, 12, 12, 26, 83 };
      int input;
      int result_size = 0;
      scanf("%d", &input);
    
      // Find out size of new array
      for (int i = 0; i < size; i++)
      {
        if (arr[i] != input)
        {
          result_size++;
        }
      }
    
      // Create new array
      int *result = (int*)malloc(result_size * sizeof(int));
      if (!result)
      {
        return 1;
      }
    
      // Fill new array
      int j = 0;
      for (int i = 0; i <size; i++)
      {
        if (arr[i] != input)
        {
          result[j++] = arr[i];
        }
      }
    
      for (int i = 0; i < result_size; i++)
      {
        printf("%d ", result[i]);
      }
    
      free(result);
      return 0;
    }
    

    【讨论】:

    • ....但问题被标记为c 而不是c++....
    • 谢谢,我习惯使用“新”。固定。
    猜你喜欢
    • 2020-05-08
    • 2019-03-23
    • 2014-08-21
    • 2016-12-08
    • 2011-03-22
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多