2016-04-20 295 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; }卡;'但我认为澄清了它!非常感谢! –

相关问题