如何在C中对链表排序?

如何在C中对链表排序?,c,sorting,linked-list,C,Sorting,Linked List,我需要能够排序或插入一个按字母顺序的链表条目。有什么好办法吗?可以进行排序(如果你想知道的话,在已经排序的列表中插入当然更简单)。你可以在libc中使用qsort()函数。本质上,您将创建一个指向节点的指针数组,并编写一个节点比较函数。。。然后调用qsort(),最后按照qsort()指定的新顺序重新创建列表。您可能希望从手动排序开始,了解如何排序,然后,看看是否可以将其写入psuedo代码。从那里很容易将其转换为程序 要获得家庭作业方面的帮助,如果您解释如何进行排序,显示一些不起作用的代码,并

我需要能够排序或插入一个按字母顺序的链表条目。有什么好办法吗?

可以进行排序(如果你想知道的话,在已经排序的列表中插入当然更简单)。

你可以在libc中使用qsort()函数。本质上,您将创建一个指向节点的指针数组,并编写一个节点比较函数。。。然后调用qsort(),最后按照qsort()指定的新顺序重新创建列表。

您可能希望从手动排序开始,了解如何排序,然后,看看是否可以将其写入psuedo代码。从那里很容易将其转换为程序

要获得家庭作业方面的帮助,如果您解释如何进行排序,显示一些不起作用的代码,并解释它应该做什么,正在做什么,那么您可能会发现更多的帮助


由于您使用的是链表,如果您可以使用二叉树,那么二叉排序(尤其是插入时可以进行排序)将是您的最佳选择。

可以为单个链表实现一个版本的
快速排序
,但通常这只是一个难题,由于
mergesort
更容易实现,并且对链表进行排序也同样有效(或更好)。

插入很容易,只需在列表中单步搜索,直到找到正确的位置,然后将新节点放在那里(前一个节点现在链接到新节点,新节点链接到前一个节点之前指向的节点)


如果您已经有一个未排序的列表,则没有有效的方法在列表中对其进行排序,这意味着您必须创建第二个集合并在其中进行排序,例如使用二叉树或数组并进行快速排序。

如果您已经对列表进行了排序,并且希望插入大量项目,最好在开始时插入它们,然后进行排序;如果只想插入几个项目,最好保持列表的排序

我的推理:

  • 起始插入为O(1)
  • 保持列表排序的插入为O(N)
  • 列表排序为O(N log N)(最多)

因此,上面的全部项目都是记录N个项目或更多,只有少数项目少于记录N个项目

,理想情况下,在插入新项目时,尽量保持链接列表的排序

然而,这一问题以这样或那样的方式在下列职位上得到了回答:


这不是你应该自己重新实现的事情(除非这是一个家庭作业问题…)。我使用glib,它实现了一个链表和排序插入,所以您不必这样做。以下是。

如果您的列表是双重链接的,您可以将其转换为二叉树,然后再次转换为链接列表

这不需要辅助存储


闻起来像是作业?Dirkgenty唯一的贡献来自他的鼻子,而这本应该来自他的大脑。您链接到的mergesort实现效率不高,很可能会被递归版本超越;更好的是,使用基于堆栈的方法并完全消除不必要的列表遍历(代码示例:),对于链表,最好对新元素进行排序,然后对原始已排序的列表进行一次遍历,并在途中将新元素插入到正确的位置。