首页 > 解决方案 > 将链表中的节点移动到前面,以便将其移动到不同的链表

问题描述

我必须编写一个程序,其中每个玩家手上都有一定数量的牌,每轮他们必须抽一张牌然后丢弃一张牌,因为他们必须在每轮结束时保持一定数量的牌。

我所写的内容对于第一个玩家(第一回合)完美无缺,但随后它到达第二个玩家(第二回合)并且程序结束。调试后发现是因为无法读取hand2

是因为指针没有指向正确的地址吗?我不确定如何解决这个问题。

void discardCard(struct card_s** hand1, struct card_s** hand2,.., struct card_s** pack, struct card_s** discardPile, ...) {

    struct card_s* prev = NULL;
    struct card_s* traverseOne = NULL; //transverse list nodes one by one
    struct card_s* skiptrasverseOne = NULL; // to transverse list nodes by skipping one

    /*
    * identify which card the user wants to discard
    * move to the front of the hand
    * move it to discardPile 
    */

    /*FIRST PLAYER WORKS JUST FINE*/
    if (currentPlayer == 0) {
        traverseOne = (*hand1);
        skiptrasverseOne = (*hand1);

        //finds the node of where the desired card to be discarded is
        while (skiptrasverseOne != NULL && skiptrasverseOne->next != NULL) {
            prev = traverseOne;
            skiptrasverseOne = skiptrasverseOne->next->next->next;
            traverseOne = traverseOne->next;
        }

        //moves node to head
        prev->next = prev->next->next;
        traverseOne->next = (*hand1);
        (*hand1) = traverseOne;
    }

    //SECOND PLAYER - PROGRAM ENDS AT THE WHILE LOOP BECAUSE IT CANNOT READ hand2.
    else if (currentPlayer == 1) {
        traverseOne = (*hand2);
        skiptrasverseOne = (*hand2);
    
        while (skiptrasverseOne != NULL && skiptrasverseOne->next != NULL) {
            prev = traverseOne;
            skiptrasverseOne = skiptrasverseOne->next->next->next;
            traverseOne = traverseOne->next;
        }

        prev->next = prev->next->next;
        traverseOne->next = (*hand2);
        (*hand2) = traverseOne;
    }

    ...
}

标签: cpointerslinked-listdouble-pointer

解决方案


推荐阅读