Ошибка сегментации с функцией UCS - PullRequest
0 голосов
/ 04 февраля 2019

Я работаю над проектом об 8-пазле N-queens для школы и уже неделю сталкиваюсь с проблемой.Я должен реализовать функцию поиска единой стоимости, чтобы решить игру.Я реализовал BFS и DFS, это сработало.Но с UCS у меня есть ошибка Сегментации, которая, вероятно, связана с моей функцией popBest, потому что BFS и UCS связаны.Кроме того, ошибка сегментации также связана с temp в моем коде, потому что при ее удалении ошибки нет.Спасибо за помощь.Вот мой код:

Item* popBest(list_t* list)
{
    assert(list);
    assert(list->numElements);
    assert(list->first);

    //  the first element is best.
    Item* best = list->first;
    int minf = best->f;

    // Search from the second element (if it exists).
    Item* item = best->next;
    while (item) {
        if (item->f < minf) {
            minf = item->f;
            best = item;
        }
        item = item->next;
    }

    delList(list, best);
    return best;
}

void ucs(void)
{
    Item *cur_node, *child_p, *temp;
    int i;

    cur_node->f = 0;

    while (listCount(&openList_p)) {
        cur_node = popBest(&openList_p);
        addFirst(&closedList_p, cur_node);
        if (evaluateBoard(cur_node) == 0.0) {
            showSolution(cur_node);
            printf("\nParcours en largeur (bfs)\n");
            return;
        }
        else {

            /* Enumerate adjacent states */
            for (i = 0; i < MAX_BOARD; i++) {
                child_p = getChildBoard(cur_node, i);
                child_p->f = cur_node->f + 1;

                if (child_p != NULL) { // it's a valid child!
                    temp = onList(&openList_p, child_p->board);

                    /* Ignore this child if already visited */
                    if (temp == NULL) {
                        /* Add child node to openList*/
                        addLast(&openList_p, child_p);
                    }
                    else if (temp != NULL && child_p->f < temp->f) {
                        delList(&openList_p, temp);
                        addLast(&openList_p, child_p);
                    }
                }
            }
        }
    }
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...