如何在不影响 C 中其他元素索引的情况下删除结构数组?



>我有一个问题。我有一个结构数组。在我的程序中,我有两个选项或菜单,分别是添加和删除。但是,当我从数组中删除一个元素时,它会影响另一个元素的索引。因此,当我删除元素并进行一些添加时,它会导致错误。我该如何解决?

这是我的代码:

#include "stdio.h"
#include "string.h"
struct itemlist
{
char name[25];
int quantity;
};
int main()
{
int progress,processNum,i,sizeStruct = 0;
struct itemlist items[105];
printf("How many progress you want to do?n");
scanf("%d",&progress); getchar();
for(i = 0; i < progress ; i++){
scanf("%d",&processNum); getchar();        
switch (processNum){
case 1: // Add
printf("Name of item :n");
scanf("%[^n]",items[i].name); getchar();
printf("How many items?:n");
scanf("%d",&items[i].quantity); getchar();
sizeStruct++;
printf("Success to add!!n"); 
break;
case 2: // Delete from database, and its last index can be replaced.
int index3;
printf("Which index do you wanna delete?n");
scanf("%d",&index3); getchar();
for(int k = index3-1; k < sizeStruct - 1; k++){
items[k] = items[k + 1];
}
sizeStruct--;
printf("Your item has been deleted.n"); 
break;
}
}
// Scan All last Items
for(int j = 0; j < sizeStruct; j++){
printf("%sn",items[j].name);
}
return 0;
}

这是删除最后一个索引而不添加的示例,这是有效的:

How many progress you want to do?
3
1
Name of item :
Cola-Cola
How many items?:
3
Success to add!!
1
Name of item :
Sprite
How many items?:
1
Success to add!!
2
Which index do you wanna delete?
1
Your item has been deleted.
Sprite // List of items

这是我在删除后尝试添加一些元素时的代码。

How many progress you want to do?
4
1
Name of item :
Cola-Cola
How many items?:
3
Success to add!!
1
Name of item :
Sprite
How many items?:
4
Success to add!!
2
Which index do you wanna delete?
2
Your item has been deleted.
1
Name of item :
Beer
How many items?:
8
Success to add!!
Cola-Cola
Sprite // Supposed to be Beer, because Sprited already deleted.

有两种可能的方法:-

  1. 使用其他一些数据结构,如链表,因为你想要的方式不能用数组来完成。
  2. 如果您必须使用数组,请使用一些唯一值(如items[i].quantity = INT_MINitems[i].quantity = -1(在索引"i"处标记要删除的元素。通过这个,您将能够通过检查数量为负值的数组元素来轻松识别已删除的元素。

相关内容

最新更新