2016-04-20 297 views
1

我想從名爲deck的鏈表中移除一個'card'(節點)並將其移動到玩家的手上。總的來說,這是一個玩家將要拿出一張牌的地方,這張牌會被加到他們的手牌上並從牌組中完全刪除。我查看了Linked Lists: Moving a node from one linked list to the next並試圖遵循這種格式以及我的交易卡功能的修改格式。不幸的是,我的功能是不輸出任何東西。我在很多不同的時間修改了這個函數,但我認爲問題在於將內存分配給手中的新空間。我也試過手和甲板上的指針指針,因爲它解決了我代碼中的許多其他問題,但是我的方法似乎沒有什麼區別。這是我最近的嘗試。無論何時我編輯它,這絕對是我更復雜的嘗試之一,我似乎添加了更多的代碼行。如何將節點從一個鏈表添加到另一個節點

void drawCard (card* hand, card* deck) { 
    card* newCard = NULL; 
    newCard = (card*)malloc(sizeof(card*)); 
    deck = deck->listp; 
    newCard = hand; 
    while (hand != NULL) { 
     hand = hand->listp; 
    } 
    newCard->face = deck->face; 
    newCard->suit = deck->suit; 
    hand = newCard->listp; 

} 

我的想法而寫,這是我在甲板上移動到列表中的下一個位置(第一個位置是「頂牌」,在播放),這將是卡進行繪圖。然後,我將newCard設置爲等於手的第一個位置,然後將手移動到列表的最後。我認爲這會在球員手上打開一個位置,但我似乎錯了。另外,我意識到我沒有添加一節從甲板上刪除節點。我是否會創建一個臨時變量,將卡節點複製到temp中,然後從卡組中釋放它?任何指導將非常感激。

+3

您對'malloc'的調用使用了錯誤的大小。你需要'sizeof(card)',而不是'sizeof(card *)'。這是等待發生的分段故障。 –

+2

'newCard =(card *)malloc(sizeof(card *));'then'newCard = hand;'會導致嚴重的內存泄漏。你正在爲'NewCard'分配一個內存,然後丟失它的蹤跡。 – alvits

+0

謝謝@TomKarzes!我完全錯過了那個額外的星號。 –

回答

1

不知道這是你的真正的要求,但你需要刪除並釋放你想跟蹤的節點您身在何處列表,並繞過節點然後免費它

card * current = list -> head; 
card * next_node = current -> next; 
/* To delete the next node*/ 
current->next = next_node-> next; 
free(next_node->data); 
free(next_node);  

要將一個節點從一個列表移到另一個列表,只需要在list1中找到插入點(strcmp?),那麼您可以在list2上進行迭代,找到您想要移動的節點,在此階段您不需要進行memove或free的釋放設置指針

node2 -> next = node1 -> next; 
node1 -> next = &node2; 

列表包含頭

struct list 
{ 
    node * head; 
    struct data * card_data; 
} 

使用這個鏈表我將不得不節點

struct *node 
{ 
    struct data * card_data; /*contains the details of this card*/ 
    node * next; /* pointer to the next node*/ 
} 

itterate下列方式假設你已經初始化他節點(每個指針需要被malloc分配)

node cur = list ->head; 
if (cur == NULL) 
{ 
    return EXIT_FAILURE; 
} 
do 
{ 

    /* some check on the node */ 
    cur = cur- > next; 
    next = cur -> next; 
}while (next != NULL) 
+0

我在這裏對你的格式有點困惑。我從來沒有見過這種格式的'card * current = list - > head;'指向列表中的節點。你只是說目前應該設置在名單的頭部嗎?另外,爲什麼我不想在第二階段釋放節點?無論如何,我想刪除該節點;爲什麼這兩個步驟不能在同一個功能上完成? –

+0

什麼是你的列表結構?在標題中你曾經說過你希望複製一個節點到另一個列表中,如果你只是簡單地獲得指向節點地址的指針。我將添加一個示例,說明如何使用這個讓我知道如果沒有澄清 – PSD

+0

我的列表結構是'struct card_s {char char; int face; struct card_s * listp; }卡;'但我認爲澄清了它!非常感謝! –

相關問題