0

我创建了一个程序来将 2 种类型的项目添加到系统中。我为 2 个不同的项目创建了 2 个结构。目前我已经创建了一种向系统添加项目的方法,并将每个项目存储在一个数组中。但是,当我要实现删除功能时遇到了一个问题,问题是如果我在数组内存索引 2 处有一条记录,如果我删除它,那么在内存索引 1 和 3 之间会有一个未使用的空间。我该如何克服这个 ?在 java 中,有一个动态分配空间的arraylist。在 C 中我知道有动态内存分配,但我如何使用删除功能来实现它?

这是我到目前为止所做的:-

#include <stdio.h>
#include <string.h>

struct routers
   {
    int Device_No;
  char Device_Name[30];
  int No_of_items;
  int Price;
  char Description[30];


  };

    /**declared an of struct routers to store the structure objects
   **/

   struct routers routerlist[5];

struct controllers
   {
   int Device_No;
   char Device_Name;
   int No_of_items;
  int Price;
  char Description[30];
  };

   void AddNewItem();


   int main()
   {
       AddNewItem();

      return 0;
  }

   void AddNewItem(){
       int item;
      int choice=0;
      int arraysize=0;


  do{

   printf("Press 1 to add a Router \nPress 2 to add a controller \n");
   scanf("%d",&item);

    printf("%d",item);

    if(item==1){
       printf("\nEnter Device No:\n");
       scanf("%d",&routerlist[arraysize].Device_No);

    printf("Enter Device Name\n");
    fflush(stdin);  //flush the buffer
    gets(routerlist[arraysize].Device_Name);

     printf("Enter Number of Items\n");
      scanf("%d",&routerlist[arraysize].No_of_items);

      printf("Enter price\n");
      scanf("%d",&routerlist[arraysize].Price);

   printf("Enter description\n");
   fflush(stdin);
   gets(routerlist[arraysize].Description);


     }
     arraysize++;
printf("Do you want to add another item? \nPress 1 to add \nPress 2 to Cancel\n");
   scanf("%d",&choice);

    }while(choice==1);


   }

感谢您的时间。

4

3 回答 3

1

根据您的时间复杂度要求,基本上有两种方法:

  1. 使用列表。列表是一种数据结构,其中每个项目都知道下一个项目的存储位置。这通常由数据结构实现,该数据结构持有指向两个同类对象(前一个对象和下一个对象)的指针。这样,当一个项目被删除时,可以调整下一个和上一个项目的指针,从而缩小差距。

    这意味着,删除一个元素非常快,但是按位置访问一个元素需要从头开始搜索,这非常慢。

  2. 使用数组。数组是一种数据结构,其中项目被连续存储。删除项目时,通过移动以下元素来填补空白。

    这意味着,按位置访问元素非常快,因为只涉及算术运算,但删除元素非常慢,因为可能需要复制大量元素。

于 2013-08-08T05:44:15.883 回答
1

要实现类似 arrayList 的行为,您需要在每次数组已满时动态分配内存。然后将当前列表的所有成员复制到该内存

在删除的情况下,您必须将元素移动一个空间到已删除的元素位置。这类似于向量在 C++ 中的实现方式。请参考我的 Vector 实现的这个答案,这个实现是在 c++ 中的。您必须研究此代码的概念是如何在需要时动态分配内存。

所以你的方法应该如下:

  1. 最初分配一些内存空间
  2. 使用它们直到到达最终分配的块
  3. 如果需要更多内存,请分配新空间。请在这里使用 realloc 你会发现它的好处
  4. 释放之前分配的内存,让之前的指针指向这个新位置。

同样,当删除元素时,只需将所有元素从末端向该元素移动一个空间。

于 2013-08-08T05:44:42.420 回答
1

删除间隙意味着移动它之后的内容,因此如果您删除索引 2,则索引 3 处的项目将移动到索引 2,然后索引 4 处的项目将移动到索引 3,依此类推。

在 C 中,您可以为此使用 memmove 函数,或者编写一个循环。

于 2013-08-08T05:44:43.807 回答