【问题标题】:Sort using linked list in c在c中使用链表排序
【发布时间】:2013-02-21 00:04:55
【问题描述】:

我正在实现排序。该程序从带有 ASCII 字符的文本文件中读取。每行有两个元素,由空格分隔。假设输入是“a b”。这定义了 a 和 b 之间的优先关系,即“a 必须出现在 b 之前”。

所以如果文件是

一个 直流电 b d

输出是

一种 b d C

我创建了两个链表

  • bigList:存储唯一元素(count 跟踪前面的元素)
  • smallList: 存储前面的元素
  • 列表项

我的代码所做的总结

  • 逐行读取文件
  • 每行抓取两个元素
  • 检查它们是否已经存在,如果不存在则插入它们
  • 根据计数打印出结果

它实际上打印出文件中的所有元素,就像上面的输入一样,我的输出是

一种 b b d d C

我是 C 编程新手,请告诉我我做错了什么。

【问题讨论】:

  • 您应该阅读有关minimum working examples 的内容并将您阅读的内容牢记在心。在此处发布您的整个代码并期望有人阅读、理解并告诉您问题所在,这并不是网站的真正意义所在。
  • 谢谢。我会记住的。
  • 谢谢,@user1476263。您的问题是否有一系列可能的输入?使用数字比说字母或字符串要容易得多。因此,如果您有 a-z 作为输入,我会将其转换为 0-25
  • 拥有链表重要吗?或者你只是想要一个排序的输出?

标签: c sorting linked-list


【解决方案1】:

我对拓扑排序知之甚少,但我认为我知道的足够多,可以发表明智的评论。任何人都可以随意编辑此回复。

我发现此实现存在几个问题。一些与 C 有关,另一些与算法有关,所以让我一次过一遍。


问题定义Topological sort 确实被定义为有向图中元素的优先级。但是,仅凭这句话并不能完全定义问题。具体来说,拓扑排序是图的元素的优先级从指定的源顶点开始。例如,假设您有以下有向图:

a -> b
b -> c
c -> a

如果你从顶点a开始,你的拓扑顺序应该是{a, b, c}。如果你从顶点c开始,你的拓扑顺序应该是{c, a, b}。因此,如果没有源顶点,问题定义就毫无意义。这种顶点的一种选择可能是图中没有边指向它的某个顶点,即每个入射边都是出边。

要记住的另一件事是图表connectedness。从任何其他顶点到达任何顶点并不总是可能的。所以在实现这样的算法时要牢记这一点。


好的数据结构是好的算法的关键。 如果你想在有向图中对事物进行排序,最好的办法是创建一个有向图数据结构,它本身将涉及创建一个Node 数据结构和一个Edge 数据结构。我建议查找adjacency lists。一旦有了这样的数据结构,只需在图表上运行breadth first search,就可以得到拓扑优先级。

在实现邻接列表时,您仍然需要将所有元素存储在一个位置。链表通常不是最好的方法,因为插入一个列表需要恒定的时间(假设对数据进行排序),搜索一个需要线性时间。那是次优的。正如@David RF 建议的那样,Red-Black treesAVL trees 将是可行的方法。但是,我不会从这个优化开始。只要你有一个完善的工作算法,你总是可以改进你的存储数据结构。毕竟链表和搜索树的接口是一样的。


如果您使用正确的算法,该算法会很快。 我在实践中没有处理过拓扑排序,所以我不知道每一个复杂性和每一个边缘情况。但!如果您使用传统的节点边数据结构进行广度优先搜索(请注意,边可以在节点内隐式定义),您的搜索本身应该使用广度优先搜索花费线性时间。

我已经阅读了你的算法,我不得不承认我并没有完全理解你的大列表和小列表的概念。模棱两可的名字并没有真正的帮助。也许它通过隐藏在某个地方的一个小错误来完成这项工作,但它不太可读。也许其他人可以评论您当前的实施。

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 2016-01-01
    • 2018-03-08
    • 1970-01-01
    • 2022-09-29
    • 2013-10-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多