C-使用排序算法交换链表中的节点

C-使用排序算法交换链表中的节点,c,algorithm,list,sorting,linked-list,C,Algorithm,List,Sorting,Linked List,我正在为学校做一个项目,在这个项目中,我需要使用任何排序算法(最好是bubble)对链表进行排序-请注意,不允许交换每个节点数据,因为我希望交换节点。我不能粘贴我的项目的所有代码,因为它非常广泛,而且是西班牙语的,因此我将向您展示我尝试实现节点交换的部分 总之,项目本身非常简单,是一个链表,其中每个节点包含一个人的信息(姓名、姓氏、年龄等) 我得按字母顺序把名单分类。请记住,我不能在函数中实现排序或交换算法(也就是说,我不能创建“swapNodes”函数并在代码中实现它) 我按照以下逻辑交换了两

我正在为学校做一个项目,在这个项目中,我需要使用任何排序算法(最好是bubble)对链表进行排序-请注意,不允许交换每个节点数据,因为我希望交换节点。我不能粘贴我的项目的所有代码,因为它非常广泛,而且是西班牙语的,因此我将向您展示我尝试实现节点交换的部分

总之,项目本身非常简单,是一个链表,其中每个节点包含一个人的信息(姓名、姓氏、年龄等)

我得按字母顺序把名单分类。请记住,我不能在函数中实现排序或交换算法(也就是说,我不能创建“swapNodes”函数并在代码中实现它)

我按照以下逻辑交换了两个节点:

firstNode = auxiliar->next;
auxiliar-> next = firstNode->next;
firstNode->next = auxiliar;
这可以完美地交换2个节点

问题是当我必须用一个排序算法来实现这个逻辑,以便对所有列表进行排序时,这就是我需要你们帮助的地方

我检查了每一篇关于冒泡排序和节点交换的帖子,但我能让它正常工作

我的教授试图帮助我,以以下方式实现我的节点交换代码(请注意,作为一个示例,以下代码应按年龄排序):

再说一次,当有两个节点时,这段代码工作得很好。如果有更多的节点,它就不能以正确的方式进行排序。此外,我不太确定我的教授使用了哪种排序算法

也许我的老师所做的是错误的,或者也许有一个更简单的方法来做

我非常感谢您的反馈,因为我自己无法找到解决问题的方法


希望你们能帮助我!

您的原始交换代码不会改变指向交换前所指向的节点
auxiliar
的节点的
next
指针(如果
auxiliar
不是列表中的第一个节点,则会出现该指针)

你应该考虑使用双链表,如果不是,你不能交换/插入/删除当前节点,只要节点不允许使用双链接席感谢你的回复,史葛!如果我没有做错任何事,我改变以前在辅助器上的节点的下一个指针(考虑它不是第一个节点)在代码的最后一部分(忘记指出这是辅助代码2和3存在的原因,它们都指向第一个节点进行初始化)如果可以,请验证交换代码是否工作;如果不工作,则没有太多进一步的意义。(如果它是它自己的功能,就更容易了;您可以在开发过程中以这种方式编写它,然后“展开”它以供最终提交。)完成后,您可以将重点放在冒泡排序中如何使用它。如前所述,它仅在列表长度为2个节点时工作。我用3个节点对其进行了测试,每个节点的int值如下(按顺序为3、2、1)并尝试根据值对它们进行排序。因此,节点1:3节点2:2节点3:1排序后,节点以以下方式链接:节点1:2节点2:1节点3:3。我觉得排序方式是正确的,但它没有解析所有列表,因此它没有完全排序。已尝试调试,但我无法看到问题是。有什么想法吗?假设您已经验证了交换代码是有效的:“尝试调试”是什么意思?您的代码如何知道它已完成排序(因为它可能停止得太早了)?它交换哪些节点对,顺序是什么?我使用两个嵌套的while循环对所有列表进行排序。首先,我解析所有列表,直到auxiliar->next==NULL(列表末尾),如果有任何更改,“flag”变量值将更改为1,如果没有更改,“flag”变量值仍将为0,这将停止第二个while循环。总之,理想情况下,它将解析列表,直到没有更改为止。我认为问题可能出在交换代码上
while (flag == 1) {
        auxiliar = firstNode;
        flag = 0;

        if (auxiliar->edad > auxiliarSiguiente->edad) {

              firstNode = auxiliar->next;
              auxiliar-> next = firstNode->next;
              firstNode->next = auxiliar;
              flag = 1;

        }

        auxiliar3 = firstNode;

        while (auxiliar->next != NULL ) {

            if (auxiliar->age > auxiliarNext->age) {

                auxiliar2 = auxiliar->next;
                auxiliar->next = auxiliar2->next;
                auxiliar2->next = auxiliar;
                auxiliar3->next = auxiliar2;

            } else {
                auxiliar = auxiliar->next;
            }

            auxiliar3 = auxiliar3->next;

        }

    }