有没有办法修改此函数,以便它删除数组中的前一个元素-C

时间:2013-04-17 22:37:49

标签: c arrays list

所以我已经被赋予了修改先前代码(模拟一副牌)的任务,通过在绘制之后移除阵列中的牌来更加准确地完成它。

我知道有很多方法可以使用链接列表来完成此操作,但我仍然很想使用链接列表,并希望得到帮助,因为我在严格的时间表上,更不用说这样做了我是如何教我的我必须完全改变我的代码,它使用数组,结构和指针,这将花费我没有的时间。

void draw(int deck[SIZE])
{
    int numCards = 10;
    int i; 
    int hand[numCards];
    int card;
    for(i = 0; i < numCards; i++)
    {
        card = deck[i];     
        hand[i] = card;     
        cards(card); 
    }
}

这是我需要修改的当前功能,以便当卡片被添加到手[i]时,卡片将从卡座[i]中移除,因此我不会重复。

卡是打印卡片的功能,可以忽略

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 52

enum faces{Ace = 0, Jack = 10, Queen, King};
char * facecheck(int d); 
void shuffle( int deck[]);
void draw(int deck[SIZE]); 
void cards(int hand); 
int i;
int main() 
{ 
    int deck[SIZE], i, n;
    char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"
    };


    srand( time( NULL ) ) ;

    for(i = 0; i<SIZE; i++)
    {
        deck[i] = i;
    };

    shuffle(deck);
    draw(deck);
    shuffle(deck); 
    draw(deck);



    return 0; 
}  

这是当前的主要功能,shuffle就像你想象的那样,并且绘制是我需要修改的功能,因为即使它随机循环通过卡片,如果运行足够两张卡片可以出现在同一只手中。

2 个答案:

答案 0 :(得分:0)

您可以使用表示删除的特殊卡(-1)。因此:

card = deck[i];     
hand[i] = card;
deck[i] = -1; // deleted  
cards(card);

答案 1 :(得分:0)

您可以创建一个删除函数,将所有下一个元素移动到上一个索引,并将最后一个索引设置为-1

但是,真的无法从C中的数组中删除元素,因为它具有无法修改的静态分配大小,所以你所能做的就是这样。< / p>

void remove_from_array(int index, int* array, int size)
{
    int i = 0;

    while (i < size)
      {
        if (i >= index && i == (size - 1))
          array[i] = -1;
        else if (i >= index)
          array[i] = array[i + 1];
        i++;
      }
}

remove_from_array(i, deck, SIZE);