用c编写的listSort函数工作错误

时间:2016-05-08 18:55:51

标签: c list selection-sort

我使用SelectionSort方法编写了一个对链表进行排序的功能。但我的逻辑中有一个错误,但无法解决。我从调试器中发现的是第二次for循环在第二次迭代后变成无限循环。但我不明白为什么。在调试器中,我看到列表中的最后一个节点中有NULL。

void listSort(node_pointer node) {

for (; node != NULL; node = node->next)
{
    node_pointer min = node;
    printf("node: %d\n", node);
    for (node_pointer j = node->next; j != NULL; j = j->next) {

        printf("next node address%d \n", node);
        if (j->value < min->value) {
            min = j;

        }

        node_pointer tmp = node;
        node = min;
        tmp->next = node->next; 
        min->next = tmp; 

    }

}

}

如果需要,这里是所有代码:

http://pastebin.com/NaUMtLv2

1 个答案:

答案 0 :(得分:1)

您正在交换内部for循环内的节点,这是错误的。在选择排序中,交换在外部for循环中完成。逻辑如下:我们选择一个元素,将其视为min,然后我们将所有下一个元素与它进行比较以找到最小值。然后我们用最初考虑的min元素交换这个新的min值。因此,正确的代码是:

void listSort(node_pointer node) {

    for (; node != NULL; node = node->next) {
        node_pointer min = node;
        printf("node: %d\n", node);

        for (node_pointer j = node->next; j != NULL; j = j->next) {
            printf("next node address%d \n", node);
            if (j->value < min->value) {
                min = j;
            }
        }

        node_pointer tmp;
        //Swap only values, no need to break the structure of nodes
        tmp->value = node->value;
        node->value = min->value;
        min->value = tmp->value; 
    }
}