在C中实现arraylist

在C中实现arraylist,c,arraylist,dynamic-memory-allocation,C,Arraylist,Dynamic Memory Allocation,我创建了一个程序,在系统中添加两种类型的项目。我已经为两个不同的项目创建了两个结构。目前,我已经创建了一个向系统添加项的方法,并将每个项存储在一个数组中。 但是我在实现delete特性时遇到了一个问题,问题是如果我在数组内存索引2中有一个记录,如果我删除它,内存索引1和3之间将有一个未使用的空间。我怎样才能克服这个问题?在java中,有一个动态分配空间的arraylist。在C中,我知道有动态内存分配,但如何使用delete特性实现它呢 以下是我迄今为止所做的工作:- #include <

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

以下是我迄今为止所做的工作:-

#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);


   }
#包括
#包括
结构路由器
{
int设备号;
字符设备名称[30];
int No_of_项目;
国际价格;
字符描述[30];
};
/**声明了一个用于存储结构对象的结构路由器
**/
结构路由器路由器列表[5];
结构控制器
{
int设备号;
字符设备名称;
int No_of_项目;
国际价格;
字符描述[30];
};
void AddNewItem();
int main()
{
AddNewItem();
返回0;
}
void AddNewItem(){
国际项目;
int-choice=0;
int-arraysize=0;
做{
printf(“按1添加路由器\n按2添加控制器”);
scanf(“%d”项和项目);
printf(“%d”,项目);
如果(项目==1){
printf(“\n输入设备编号:\n”);
scanf(“%d”),&routerlist[arraysize]。设备号;
printf(“输入设备名称”);
fflush(stdin);//刷新缓冲区
获取(路由器列表[arraysize]。设备名称);
printf(“输入项目数量\n”);
scanf(“%d”,&routerlist[arraysize]。没有\u个项目);
printf(“输入价格”);
scanf(“%d”,&routerlist[arraysize].Price);
printf(“输入说明”);
fflush(stdin);
获取(routerlist[arraysize].Description);
}
arraysize++;
printf(“是否要添加其他项目?\n按1添加\n按2取消\n”);
scanf(“%d”,选择(&C);
}while(choice==1);
}

谢谢您的时间。

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

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

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

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

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


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

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

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

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

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


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

    在删除的情况下,必须将图元移动一个空间到删除的图元位置。这类似于C++中如何实现向量。请参考矿山矢量实现的答案,这个实现是在C++中实现的。您必须研究的概念是在需要时如何动态分配内存

    因此,您的方法应如下所示:

  • 最初分配一些内存空间
  • 使用它们直到到达最终分配的块
  • 如果需要更多内存,请分配新空间。请在这里使用realloc,您会发现它的优点
  • 释放以前分配的内存,让以前的指针指向这个新位置

  • 类似地,删除元素时,只需将所有元素从末尾向该元素移动一个空格。

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

    在删除的情况下,必须将图元移动一个空间到删除的图元位置。这类似于C++中如何实现向量。请参考矿山矢量实现的答案,这个实现是在C++中实现的。您必须研究的概念是在需要时如何动态分配内存

    因此,您的方法应如下所示:

  • 最初分配一些内存空间
  • 使用它们直到到达最终分配的块
  • 如果需要更多内存,请分配新空间。请在这里使用realloc,您会发现它的优点
  • 释放先前分配的内存,并释放先前分配的内存