在c中按字母顺序对链表进行排序

时间:2014-04-19 21:29:13

标签: c struct linked-list st

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

“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;
}

1 个答案:

答案 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来实现你的结果。

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