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--;
}
}
我正在编写 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--;
}
}