用c语言按字母顺序排列链表

用c语言按字母顺序排列链表,c,struct,linked-list,st,C,Struct,Linked List,St,我想问你们,是否有可能简单地按名字的字母顺序排列链表?我认为这是可能的,但我不知道怎么做。你能帮我吗?我会非常感激的 我应该扫描新的名字,将这个名字添加到链表中,然后按字母顺序对这个列表进行排序 d按应显示整个排序列表 k程序结束 我用结构数组做了这个,它工作得很好,但我不知道如何用链表做同样的事情 多谢各位: 以下是代码: #include <stdlib.h> #include <stdio.h> #include <string.h> typedef

我想问你们,是否有可能简单地按名字的字母顺序排列链表?我认为这是可能的,但我不知道怎么做。你能帮我吗?我会非常感激的

我应该扫描新的名字,将这个名字添加到链表中,然后按字母顺序对这个列表进行排序 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;
}

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

每当你试图解决这样的问题时,试着找出你需要解决的基本的小问题。例如,任何类型的排序都要求能够交换元素,并且在大多数情况下能够比较元素

比较非常直观:您需要对元素对调用strcmp或类似的函数。但是,您可能需要执行一个函数来完成这项工作,以保持代码的整洁

交换有点困难。如果分析交换过程,您将看到它包含两个基本操作:从列表中删除一个元素和在给定位置插入一个新元素。因此,您可能需要创建两个实现这些操作的函数。我建议您插入一个函数,该函数在您提供的元素之后删除一个元素,并在您提供的元素之后插入一个单独的喜欢列表,因为之前很难找到该元素

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

a->next=(a->next)->next 
因此->下一步指向元素的邻居

在A之后插入B:

B->next = A->next
A->next = B
现在,您有了这两个操作,创建一个交换两个元素的函数很简单。实际上,我建议创建一个函数,在您指示的元素之后交换两个元素,所以swapA,B交换a->next和B->next。此外,比较函数应该在您指定的元素之后比较元素

您可以将我上面描述的那些过程与任何排序算法一起使用,如quicksort或bubblesort,以实现您的结果


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

当然有可能,但链表对这一点不是很好。每次插入新词时,您都需要遍历列表,从开头开始,在希望插入列表末尾的位置停止遍历列表。下一次,试试这棵树。此外,如果用户键入的单词长度超过100个字符,请小心这些scanf调用…malloc可以存储指向每个节点的指针的数组,使用qsort,重新链接,释放数组,完成。