我想问你,是否可以简单地按字母顺序对名字进行排序?我认为这是可能的,但我不知道如何。你能帮帮我吗?我将非常感激。
“i”按下应扫描新名称并将此名称添加到链接列表,然后按字母顺序对此列表进行排序 按下“d”应该显示整个排序列表
“k”按下程序结束
我用结构数组做了这个并且它运行良好,但我不知道如何对链表做同样的事情......
非常感谢:)
这是代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
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 < k; i++) {
if(i == 0)
p_act = p_first;
else
p_act = p_act->next;
printf("%s\n", p_act->name);
}
}
}
getchar();
return 0;
}
答案 0 :(得分:0)
如果你想要实际的代码,你来的地方错了。但我可以给你一个基本的想法。
每当您尝试解决此类问题时,请尝试找到您需要解决的基本小问题。例如,排序(任何类型),需要交换元素的能力,并且在大多数情况下,需要比较元素。
比较非常直观:你需要在元素对上调用strcmp()或类似的东西。但是,您可能希望执行一项功能来完成此任务以保持代码清洁。
交换有点困难。如果分析交换过程,您将看到它意味着2个基本操作:从列表中删除元素并在给定位置插入新元素。因此,您可能希望创建两个实现这些操作的函数。我建议你在你提供的元素之后删除一个删除元素的函数,并在你提供的元素之后插入(你的列表是一个单一的列表,之前很难找到该元素)。
要删除A之后的元素,只需使用以下作业:
a->next=(a->next)->next
(所以A->接下来指向它的邻居之后的元素)
在A:
之后插入B.B->next = A->next
A->next = B
现在,您有这两个操作,创建一个交换2个元素的函数很简单(实际上,我建议创建一个函数,在您指定的元素之后交换2个元素,因此交换(A,B)交换A - &gt; next和B-&gt; next)。此外,比较函数应比较您指定的元素之后的元素。
你可以使用我上面描述的那些程序和任何排序算法,比如quicksort或bubblesort来实现你的结果。
请注意,这仅仅是实现的基本概念,以及您应该如何思考这样的问题的一些迹象。我希望它足够清楚。