C .....链表的重排值

C.....Shufling values of linked list

我正在编写 war 纸牌游戏。我需要洗牌玩家手中的前几个元素(链表)。 这就是我所拥有的:

void tasowanie(llist_t** head, int warsize) {
    llist_t** temp = head;
    Card_t temp_card;
    int random;

    while (warsize > 0) {
        random = rand() % warsize;
        for (int j = 0; j < random; j++)
            if ((*temp)!=NULL && (*temp)->next != NULL)
                *temp = (*temp)->next;
        temp_card = (*head)->card;
        (*head)->card = (*temp)->card;
        (*temp)->card = temp_card;
        *head = (*head)->next;
        *temp = *head;
        warsize--;
    }
}

问题是我正在丢失此列表的元素。 我正在考虑将这些元素放入数组中,然后将其打乱并放回列表中,尽管我认为必须有更优雅的解决方案。

您不应该写入 *temp,因为这是指向真实列表 next 指针的指针。

这同样适用于移动 head:除非您打算更新列表,否则您不应触摸 *head

相反,当您想要更新 temp 时,您应该将其设置为 temp = &((*temp)->next),并使用 temp=head 重新设置。

void tasowanie(llist_t** head, int warsize) {
    llist_t** temp = head;
    Card_t temp_card;
    int random;

    while (warsize > 0) {
        random = rand() % warsize;
        for (int j = 0; j < random; j++)
            if ((*temp)!=NULL && (*temp)->next != NULL)
                temp = &((*temp)->next);
        temp_card = (*head)->card;
        (*head)->card = (*temp)->card;
        (*temp)->card = temp_card;
        head = &((*head)->next);
        temp = head;
        warsize--;
    }
}