【问题标题】:C - Swapping nodes in a linked list with a sorting algorithmC - 使用排序算法交换链表中的节点
【发布时间】:2014-09-23 22:28:35
【问题描述】:

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

综上所述,项目本身很简单,一个链表,每个节点都包含一个人的信息(姓名、姓氏、年龄等)。

我必须按字母顺序对列表进行排序。请记住,我不能在函数中实现排序和交换算法(也就是说,我不能创建一个'swapNodes'函数并且他们在代码中实现它。

我设法按照这个逻辑交换了两个节点:

firstNode = auxiliar->next;
auxiliar-> next = firstNode->next;
firstNode->next = auxiliar;

这可以完美地交换 2 个节点。

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

我已经检查了所有关于冒泡排序和节点交换的帖子,但我可以让它正常工作。

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

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;

        }

    }

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

也许我的老师做错了,或者有更简单的方法。

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

希望大家能帮帮我!

【问题讨论】:

  • 你应该考虑有一个双向链表,否则你不能交换/插入/删除当前节点,只是节点之后
  • 我不允许使用双向链表

标签: c algorithm list sorting linked-list


【解决方案1】:

您的原始交换代码不会更改节点的next 指针,该指针指向 指向在交换之前指向的节点auxiliar(如果auxiliar 不是列表中的第一个节点)。

【讨论】:

  • 感谢您的回复,斯科特!如果我没有做错任何事情,我会在代码的最后部分更改辅助之前的节点的下一个指针(考虑到它不是第一个节点)(忘记指出这是辅助 2 和 3 存在的原因, 两者都初始化指向第一个节点)
  • 如果可以,请验证您的交换代码是否有效;如果没有,那么进一步发展就没有多大意义了。 (如果它是它自己的函数会更容易;您可以在开发过程中这样编写它,然后“展开”它以进行最终提交。)一旦完成,您就可以专注于它在冒泡排序中的使用方式。
  • 如前所述,它仅在列表长度为 2 个节点时才有效。我用 3 个节点对它进行了测试,每个节点都有以下 int 值(按顺序为 3、2、1),并尝试根据值对它们进行排序。所以, Node 1: 3 Node 2: 2 node 3: 1 排序后,节点按以下方式链接: Node 1: 2 Node 2: 1 Node 3: 3 。我觉得它以正确的方式排序,但它没有解析所有列表,所以它没有完全排序。已经尝试调试,但我无法看到问题所在。有什么想法吗?
  • 假设您已验证交换代码有效:“尝试调试”是什么意思?您的代码应该如何知道它已完成排序(因为它可能停止得太早了)?它交换了哪对节点,以什么顺序交换?
  • 我使用两个嵌套的 while 循环来对所有列表进行排序。首先,我解析所有列表,直到 auxiliar->next == NULL (列表末尾),如果有任何更改,'flag' 变量值将更改为 1,如果没有,它的值仍将是 0 ,这将停止第二个 while 循环。总而言之,理想情况下它会解析列表,直到没有进行任何更改。我认为问题可能出在交换代码上
猜你喜欢
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多