我正在尝试从名为deck的链接列表中删除“卡片”(节点)并将其移动到播放器的手上。总的来说,这是一个玩家将要张卡的地方,这样卡就会被添加到他们的手中并完全从牌组中删除。我查看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设置为等于手的第一个位置,然后将手移到列表的最后。我认为这会在玩家手中打开一个位置,但我似乎错了。此外,我意识到我没有添加一个部分来从卡座中删除节点。我是否只需创建一个临时变量,将卡节点复制到临时变量,然后将其从卡座中释放出来?任何指导都将非常感激。
答案 0 :(得分: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找到你想要移动的节点,你不需要记住或释放这个阶段你需要设置指针
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*/
}
假设你已经初始化了他的节点(每个指针需要被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)