C:通过交换元素数据对链表进行排序

时间:2014-10-22 20:17:55

标签: c sorting linked-list

给定国际象棋中的移动列表,我想对列表进行排序,使得所有捕获移动将首先在列表中,非捕获移动在列表的末尾。

我在运行此代码时遇到无限循环而不知道原因。我查看了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;
        }

    }
}
}

1 个答案:

答案 0 :(得分:0)

你得到一个无限循环,因为你只修改内循环中的move。列表排序后,您将在最后获得所有非获胜动作。一旦move到达第一个非获胜的移动,内部循环就会停止修改move(它是你的第三个测试用例,其中两个isCapture函数都返回0),它只会next = next->next

外部循环永远不会满足条件,因为move永远不会到达列表的末尾。