我想使用索引数组从数组中删除多个元素,这是我的代码:
// b is an index array, n is size of b,
// player is the array need to be delete elements,
// size is the size of player
void play_cards(int b[],int n,int player[],int *size){
int i;
for(i = 0; i < n; i++)
delete_cards(b[i],player,size);
}
void delete_cards(int n,int player[],int *size){
int i;
for(i = n; i < *size; i++)
player[i] = player[i+1];
*size -= 1;
}
int main(void){
int player[10] = {1,2,3,3,4,4,5,5,6,7};
int index[6] = {2,3,4,5,6,7};
int size = 10;
play_cards(index,6,player,&size);
for(int i = 0; i < size; i++)
printf("%d|",player[i]);
puts("");
return 0;
}
我希望print播放器应该是1,2,6,7而不是1,2,3,4。我该怎么修?
最佳答案
首先,我不会调用函数delete_cards
,因为它建议删除多张卡片,而这不仅仅是delete_card
让事情更清楚。
不管怎样-在您玩完player
数组中的所有牌之前更改index
数组时,您将更改索引的含义。这就是为什么你当前的代码不起作用。
所以你可以做两件事:
a)先玩所有牌,然后删除已玩的牌。这可以通过首先用-1
标记玩过的牌,然后在循环中删除所有-1
元素来完成
或
b)玩一张牌,删除它,并通过将其递减一次来调整index
中的剩余元素。注意:此解决方案要求对index
进行排序(最低优先)。
解决方案a)可能看起来像这样:
void delete_played_cards(int player[],int *size)
{
int i;
int next_pos = 0;
int deleted = 0;
for(i = 0; i < *size; i++)
{
if (player[i] != -1)
{
player[next_pos] = player[i];
if (i != next_pos)
{
player[i] = -1;
}
++next_pos;
}
else
{
++deleted;
}
}
*size -= deleted;
}
void play_cards(int b[],int n,int player[],int *size)
{
int i;
for(i = 0; i < n; i++)
{
player[b[i]] = -1; // Mark card as played
}
delete_played_cards(player,size);
}
int main(void)
{
int player[10] = {1,2,3,3,4,4,5,5,6,7};
int index[6] = {2,3,4,5,6,7};
int size = 10;
play_cards(index,6,player,&size);
for(int i = 0; i < size; i++)
printf("%d|",player[i]);
puts("");
return 0;
}
关于c - 如何同时从数组中删除多个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36968396/