使用 MinGW 编译-O3 -Wall -c -fmessage-length=0 -std=c99
好吧,这就是我认为的问题所在......这是细分:
我有一个我使用的链接列表
typedef struct Coordinate{
int x;
int y;
struct Coordinate *next;
} Coordinate;
我在 6x6 棋盘(矩阵)上添加“有效动作”(在黑白棋/黑白棋游戏中)。我检查移动是否有效的逻辑工作得很好——它把东西添加到让我陷入麻烦的列表中。
出于显而易见的原因,我想避免将重复值添加到列表中。但是,我尝试编写的每个函数(看起来应该可以工作)只会使应用程序崩溃,从而在漫长的一天中造成段错误。
所以这是我尝试编写的一个函数:
int inList(Coordinate *list, int x, int y) {
if (list == NULL) return 0;
while (list != NULL) {
if (list->x == x && list->y == y) return 1;
else list = list->next;
}
return 0;
}
并称它为:
Coordinate *validMoves = createNewCoordinate(-1, -1); // Just so that there is *something*
if (!inList(validMoves, 1, 1)) {
validMoves->next = createNewCoordinate(1, 1);
validMoves = validMoves->next;
}
据我所知,这应该可以完美运行。我已经在网上查找了示例,到目前为止,我在这个特定程序中对指针的所有真正令人费解的使用都没有遇到任何问题。
无论如何,真正的问题是,如果我不阻止重复项进入同一个列表(通过指针连接),那么我会得到一个无限循环(我想这是由于两个元素被认为是相等的,因为它们的非指针类型相等)。
我已经在 pastebin 上发布了代码的所有三个部分以供完整参考(不用担心,开源,伙计!): othello.c othello_engine.c othello_engine.h
我试过调试,但我不是很擅长,我真的没有看到任何值得一提的东西。谁能解释可能发生的事情和/或举例说明如何避免链表中的重复?(我试过很多方法让我的大脑受伤)
编辑:我确实知道,当我稍后遍历列表时(在游戏中多次有效“转弯”之后),由于以下输出,我正在让自己进入周期性参考:
{1, 4} {3, 4} {1, 4} {3, 4} {1, 4} {3, 4}
我不知道theList = theList->next = theList
(伪正确)是如何进入那里的,也许我们在矩阵中......