0

ポインターに問題があります。リンクされたリスト キューを使用して幅優先の状態空間検索を実行しようとしていますが、キューの作成 (またはキューのリンク) に問題があります。スニペットは次のとおりです。

typedef struct queueList {
    STATE *state;
    queueList *next;
    queueList(STATE *state): state(state), next(NULL) {}
    ~queueList() {delete next;}
} QUEUE_ELEMENT;

void moveAround(STATE *start) {
    QUEUE_ELEMENT *queueBegin = new QUEUE_ELEMENT(start);
    QUEUE_ELEMENT *queueEnd;
    queueBegin->next = queueEnd;
    while (queueBegin != NULL) {
        STATE *current = queueBegin->state;
        if (compareStates(current,finish) == 1) {
            answer = current;
            return;
        }
        for (int i = 0; i < 12; i++) {
            STATE *newState = expandState(current, i);
            if (newState != NULL) {
                queueEnd = new QUEUE_ELEMENT(newState);
                queueEnd = queueEnd->next;
            }
        }
        queueBegin = queueBegin->next;
    }
}

何が悪かったのか?queueBegin->next は、割り当てられるべきであっても、何にも割り当てられていません (可能な状態が見つかりました)。

4

1 に答える 1

0

コードをたどるのに問題があるが、問題が見られる

QUEUE_ELEMENT *queueEnd;
queueBegin->next = queueEnd;

queueEnd初期化されていない変数です。

さらに見ると、queueEnd がキューの最後を指すようにし、expandState が非 NULL を返したときに、新しい状態をキューに追加したいと考えています。残念ながら、あなたが書いたコードはそのようなことはしません。多少推測していますが、これはもう少し近いようです

QUEUE_ELEMENT *queueBegin = new QUEUE_ELEMENT(start);
QUEUE_ELEMENT *queueEnd = queueBegin;

...

        STATE *newState = expandState(current, i);
        if (newState != NULL) {
            QUEUE_ELEMENT *newQueueEnd = new QUEUE_ELEMENT(newState);
            queueEnd->next = newQueueEnd;
            queueEnd = newQueueEnd;
        }

また、キューの先頭からアイテムを取り出すコードの部分も見当たりません。それは通常あなたがすることです。

于 2013-04-03T16:06:52.617 に答える