我想使用索引数组从数组中删除多个元素,这是我的代码:

// 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/

10-11 22:57
查看更多