【问题标题】:How to insert an element starting the iteration from the beginning of the array in c?如何在c中从数组的开头插入开始迭代的元素?
【发布时间】:2021-04-08 16:36:38
【问题描述】:

我已经看到从后端开始迭代的数组中插入元素。但是我想知道是否可以从前面插入

【问题讨论】:

  • 您说的是 C、C++ 还是 C#?因为 C 使用固定长度的数组。添加元素涉及分配另一个数组,然后复制项目。
  • @KrishnaAcharya 你可以反转迭代。
  • 如果你有一个c++20兼容的编译器,你可以在处理STD容器时查看std::front_inserter
  • 通常,当我想要一个允许我执行插入/删除操作的数据结构时,我会选择doubly linked list,它不难实现而且省时。
  • 您的作业是专门说要使用数组还是只是为了创建优先级队列?

标签: arrays c loops insertion-sort insertion


【解决方案1】:

终于找到办法了,代码来了

 #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

【讨论】:

    【解决方案2】:

    在 C 中,数组有一个“本机”内置实现,基于指向第一个元素的地址(也称为指针)和用于元素寻址的 [] 运算符。

    一旦分配了一个数组,它的实际大小就不会自动处理或检查:代码需要确保边界不被越界。

    此外,在 C 中,任何变量都没有默认值(又名 empty),其中包括数组和数组元素。

    不过,在 C 中没有像数组元素的插入附加删除这样的东西。您可以使用 [] 运算符简单地引用第 n 个(n0 开始)数组元素。 因此,如果您有一个数组,则不能在其第 n 个位置插入一个新项目。您只能读取或(覆盖)写入其中的任何项目。

    任何其他操作,如插入或删除,都需要临时代码,基本上可以归结为将数组元素向前移动(为插入腾出空间)或向后移动(为 删除一个)。 这是 C 语言的本质,不应被视为限制:任何其他允许这些数组操作的语言都必​​须具有较低级别的隐藏实现或非平凡的数据结构来实现数组。

    这意味着,在 C 语言中,在将内存使用量保持在最低限度的同时,这些数组操作需要一些耗时的实现,例如项目移动操作。 然后,您可以权衡内存使用量与时间使用量,并通过使用单链表和双链表等来提高整体效率。您为链接指针失去了一些内存,以支持更快的插入广告删除操作。这主要取决于实施目标。

    最后,要回答最初的问题,实际的答案需要一些额外的细节,比如内存与时间的权衡,以实现目标。

    @Krishna Acharya 描述的解决方案是一个简单的基于移位的解决方案,没有边界检查。一个非常简单且有点幼稚的实现。

    最后一点。 Krishna 的代码在数组末尾显示的0s 应仅被视为随机值。正如我之前所说,没有默认值。 代码应该是:

    int array[10] = {1, 2, 3, 4, 6, 7, 8, 9, 0, 0};
    

    为了确保最后两个数组元素的任何未使用值都是0

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多