按字母顺序对链表进行排序

我想问你,如果可以简单地按字母顺序对名字进行排序? 我认为这是可能的,但我不知道如何。 你能帮帮我吗? 我将非常感激。

“我”按下应该扫描新名称并将此名称添加到链表,然后按字母顺序对此列表进行排序“d”按下应显示整个排序列表

“k”按下程序结束

我用结构数组做了这个,它工作得很好,但我不知道如何对链表做同样的事情……

非常感谢你 :)

这是代码:

#include  #include  #include  typedef struct list{ char name[100]; struct list *next; }LIST; int main() { int i, n, k = 0, v = 0, m = 0, j = 0; char str[100], c; LIST *p_first = NULL, *p_act = NULL, *p_prev = NULL; while((c=getchar())!='k') { if(c=='i') { if(k == 0) { p_first = (LIST *) malloc(sizeof(LIST)); //scan first element of struct scanf("%s", p_first->name); p_act = p_first; } else { p_act->next = (LIST *) malloc(sizeof(LIST)); //scan next element of struct p_act = p_act->next; scanf("%s", p_act->name); //here should be code to sort text alphabetically } p_act->next = NULL; k++; } else if(c=='d') { //display all elements of linked list for(i = 0; i next; printf("%s\n", p_act->name); } } } getchar(); return 0; } 

如果你想要实际的代码,你来的地方错了。 但我可以给你一个基本的想法。

每当您尝试解决此类问题时,请尝试找到您需要解决的基本小问题。 例如,排序(任何类型),需要交换元素的能力,并且在大多数情况下,需要比较元素。

比较非常直观:您需要在元素对上调用strcmp()或类似的东西。 但是,您可能希望执行一项function来完成此任务以保持代码清洁。

交换有点困难。 如果分析交换过程,您将看到它意味着2个基本操作:从列表中删除元素并在给定位置插入新元素。 因此,您可能希望创建两个实现这些操作的函数。 我建议你在你提供的元素之后删除一个删除元素的函数,并在你提供的元素之后插入(你的列表是一个单一的列表,之前很难找到该元素)。

要在A之后删除元素,只需使用以下赋值:

 a->next=(a->next)->next 

(所以A-> next指向它的邻居之后的元素)

在A之后插入B:

 B->next = A->next A->next = B 

现在,您有这两个操作,创建一个交换2个元素的函数很简单(实际上,我建议创建一个函数,在您指定的元素之后交换2个元素,因此交换(A,B)交换A-> next和B->下一步)。 此外,比较函数应比较您指定的元素后面的元素。

你可以使用我上面描述的那些程序和任何排序算法,比如quicksort或bubblesort来实现你的结果。

请注意,这仅仅是实现的基本思想,以及关于您应该如何思考这样的问题的一些迹象。 我希望它足够清楚。