因此,我目前正在为这个学校项目工作,正在实施一种算法来找到“骑士游戏”的解决方案(这是找到从棋盘左上角到右下角的最短路径)的方法),但现在已经出现了三段错误,我检查了我使用的每个指针,一切似乎都正确。 我建议使用“搜索算法”(bfs,dfs和ucs),前两个算法可以正常工作,但是ucs会给我带来分割错误,尽管它们使用的是popBest函数,但它们使用的是相同的东西。 这是ucs和popBest函数的一些图片:
Item *popBest( list_t *list ) // and remove the best board from the list.
{
assert(list);
assert(list->numElements);
int min_f;
Item *item = list->first;
Item *best;
min_f = list->first->f;
while (item) {
if (item->f < min_f) {
min_f = item->f;
best = item;
}
item = item->next;
}
//item = onList(list, board);
delList(list, best);
return best;
}
void ucs(void)
{
Item *cur_node, *child_p, *temp;
while ( listCount(&openList_p) ) { /* While items are on the open list
printLt(openList_p );
/* Get the first item on the open list*/
cur_node = popBest(&openList_p);
//printf("%d %f\n", listCount(&openList_p), evaluateBoard( cur_node ));
printBoard(cur_node);
addFirst(&closedList_p, cur_node);
if ( evaluateBoard(cur_node) == 0.0 ) {
showSolution(cur_node);
printf("\nParcours en largeur (bfs)\n" );
return;
}
else {
for (int i = 0; i < MAX_BOARD; i++) {
child_p = getChildBoard( cur_node, i );
if (child_p != NULL) {
child_p->f = cur_node->f+1;
temp = onList(&openList_p, child_p->board);
if (temp ==NULL) addLast( &openList_p, temp);
else if (temp != NULL && child_p->f < temp->f )
{
delList(&openList_p, temp);
addLast( &openList_p, temp);
}
}
}
}
}
return;
}
所有功能对于bfs和dfs都可以正常工作,唯一的区别是popBest函数。 如果我仍然是初学者,如果有人可以指导我,那将非常棒,谢谢。
PS:对不起,英语不好,我不是本地人。
答案 0 :(得分:1)
您执行list->first->f
时没有检查list->first
是否为空指针。
问题的原因可能是best
可能在循环后未初始化,并且肯定是列表中的第一个元素是“最佳”。
这是一个更安全的版本。
Item *popBest( list_t *list )
{
assert(list);
assert(list->numElements);
assert(list->first);
// Assume that the first element is best.
Item *best = list->first;
int min_f = best->f;
// Search from the second element (if it exists).
Item* item = best->next;
while (item) {
if (item->f < min_f) {
min_f = item->f;
best = item;
}
item = item->next;
}
delList(list, best);
return best;
}