给定国际象棋中的移动列表,我想对列表进行排序,使得所有捕获移动将首先在列表中,非捕获移动在列表的末尾。
我在运行此代码时遇到无限循环而不知道原因。我查看了4种不同的情况 - 我以一种看似合乎逻辑的方式迭代了列表。如果有经验的人可以看看,我将不胜感激。谢谢!
void sort(move_t* head, game_t game) {
move_t* move, *next;
int x1,y1,x2,y2;
char s;
move = head;
while(move != NULL)
{
next = move->next;
while(next != NULL)
{
if((isCapture(game,move) == 0) && (isCapture(game,next)== 1))
{
x1 = move->x1;
y1 = move->y1;
x2 = move->x2;
y2 = move->y2;
s = move->s;
move->x1 = next->x1;
move->y1 = next->y1;
move->x2 = next->x2;
move->y2 = next->y2;
move->s = next->s;
next->x1 = x1;
next->y1 = y1;
next->x2 = x2;
next->y2 = y2;
next->s = s;
move = next;
next = next->next;
}
else if((isCapture(game,move) == 1) && (isCapture(game,next)== 0))
{
move = move-> next;
next = move-> next;
}
else if((isCapture(game,move) == 0) && (isCapture(game,next)== 0))
{
next = next->next;
}
else if((isCapture(game,move) == 1) && (isCapture(game,next)== 1))
{
move = move -> next;
next = move -> next;
}
}
}
}
答案 0 :(得分:0)
你得到一个无限循环,因为你只修改内循环中的move
。列表排序后,您将在最后获得所有非获胜动作。一旦move
到达第一个非获胜的移动,内部循环就会停止修改move
(它是你的第三个测试用例,其中两个isCapture
函数都返回0),它只会next = next->next
。
外部循环永远不会满足条件,因为move
永远不会到达列表的末尾。