c - C如何访问结构内的链表
问题描述
当调用 newGame 时,我正在尝试在 drawPile 中创建一副牌(将特定牌作为参数给出)
我有 4 个链接列表来存储卡片(drawPile、discardPile、player1 的手和 player2 的手)
我的 _game 结构将存储我的游戏在给定时间的状态(例如 drawPile、discardPile 和 player1,2 手中的牌)
我无法理解我应该如何在struct _game 中使用drawPile 链表。创建 _game 时,我应该如何为 drawPile、discardPile..etc 分配内存?因为我相信我目前在 newGame 中拥有的东西是完全错误的。
任何建议或提示将不胜感激。
typedef enum {RED,BLACK} color;
typedef enum {HEARTS,DIAMONDS,CLUBS,SPADES} suit;
typedef enum {ONE,TWO,THREE,FOUR} value;
typedef struct drawPile{
enum color color;
enum suit suit;
enum value value;
struct drawPile *next;
}*drawPile;
我有点困惑在drawPile之前放*有什么区别?
typedef struct discardPile{
enum color color;
enum suit suit;
enum value value;
struct discardPile *next;
};
typedef struct player1Hand{
enum color color;
enum suit suit;
enum value value;
struct player1Hand *next;
};
typedef struct player2Hand{
enum color color;
enum suit suit;
enum value value;
struct player2Hand *next;
};
typedef struct _game{
drawPile game_drawPile;
discardPile game_discardPile;
player1Hand game_player1Hand;
player2Hand game_player2Hand;
}Game;
Game newGame(int deckSize, value values[], color colors[], suit suits[]){
Game nGame;
for(int i = 0; i < deckSize; i++){
nGame->drawPile.value = value[i];
nGame->drawPile.color = colors[i];
nGame->drawPile.suit = suits[i];
}
}
下面是一个示例 main 函数,说明 newGame 函数将如何仅使用 4 张卡运行。
int main (void){
init_deck();
}
static void init_deck(void){
int deck_size = 4;
value values[] = {ONE, TWO, THREE, FOUR};
color colors[] = {RED, BLACK, RED, BLACK};
suit suits[] = {HEARTS, DIAMONDS, CLUBS, SPADES};
Game game = newGame(deck_size, values, colors, suits);
}
我只粘贴了我的代码片段,如果您需要更多信息,请告诉我。
解决方案
首先,您可以对所有链表使用相同的 Struct。
struct Card {
enum color color;
enum suit suit;
enum value value;
};
struct CardList {
struct Card *card;
struct CardList *next;
};
然后你可以编写函数来在列表中添加/删除卡:
CardList *add(CardList **list, Card *card);
在新游戏中:
Game *newGame(int deckSize, value values[], color colors[], suit suits[]){
Game *nGame = (Game*) malloc(sizeof(Game));
for(int i = 0; i < deckSize; i++){
Card* card = (Card*) malloc(sizeof(Card));
... assign variable
add(&game->drawPile, card);
}
return nGame;
}
推荐阅读
- sql - 如何设计一个不可变的仅附加数据库?
- android - TextUtils.isEmpty 检查 null 但 lint 无法识别
- acumatica - 自定义处理按钮生成 NoteID 的问题
- batch-file - 解析参数是逗号分隔的字符串,传递给批处理文件
- bash - 将文件读入没有换行符的变量
- java - 找到多个文件,其独立于操作系统的路径 'com/mysql/cj/configurations/3-0-Compat.properties'
- reactjs - 防止不必要的子元素重新渲染
- c# - TextBox 验证将按钮边框设置为红色
- java - javax.validator 与 spring 组件
- kubernetes - 使用 Kubernetes/Containers 构建 Android 应用程序有什么好处