如何在C中对链表进行排序

时间:2018-01-30 07:06:53

标签: c

我正在尝试对链接列表进行排序,但我无法做到。我不需要交换节点。 我试图使用类似数组的排序算法解决问题,但它不正确

typedef struct list {
        char ch;
        int n;
        struct list *next;
    } List;

List *SortList (List *GeneralList)
{
    int swapped, TempN;
    char TempCh;
    List *Current=NULL;
    do
    {
        swapped=0;
        for (Current=GeneralList; Current->next==NULL; Current=Current->next)
        {
            if (Current->ch>Current->next->ch)
            {
                TempN=Current->n;
                TempCh=Current->ch;
                Current->n=Current->next->n;
                Current->ch=Current->next->ch;
                Current->next->n=TempN;
                Current->next->ch=TempCh;
            }
            swapped = 1;
        }
    }
    while (swapped==0);
    return GeneralList;
}

2 个答案:

答案 0 :(得分:0)

如果您有许多链接,那么您正在进行的那种排序可能非常慢 如果您能够这样做,我建议您进行插入排序:每次获得链接时,请将其放在链接列表中的正确位置。

这是一个应该有用的链接: Insertion sort
但是,如果你真的想要一个冒泡排序(如果你没有太多的链接,那就很有用): Bubble sort

当我创建链表排序函数时,我通常使用void func,它将**列表作为参数,因此我可以在函数中交换节点。

希望我帮助你,祝你好运!

答案 1 :(得分:0)

以下是对代码的一些更改,现在应该可以使用了。 请注意关键变化:

  • 在布尔表达式中,我已将值移到左侧,这样就不会错误地进行赋值
  • 交换操作已导出到外部函数。我没有改变你的逻辑,但我建议做一个更通用的交换功能。如果您尚未学习void*类型,则可能会将内部逻辑导出为2个函数Swap(int,int)Swap(char,char),并将它们合并到SwapNode(List*,List*)函数中。功能越多越好!
  • swapped变量将其名称更改为swapFlag,因此它会更清楚它的作用。它的值更改为true已在if语句中移动,就在实际交换之后。
  • 在同一主题上,您会希望循环在发生交换时运行。如果交换DID没有发生,那么你就停止了。
  • for循环应在列表未结束时运行。情况也相应改变了。

我认为你应该考虑的变化:

  • 考虑根据单词role更改字母大写。那里有一些公约。尝试使用首字母小的所有变量和首字母大写的函数。这将使您的代码更具可读性。
  • 在编写函数时,使括号看起来像这样:foo()而不是这样:foo ()。此外,更具可读性。
  • 不要对新的线条或空格吝啬。当所有东西挤在一起时,就会更难看到代码的不同区域。
  • 考虑使用#DEFINE来使用TRUEFALSE而不是10。更方便。
  • 在开始时GeneralList续订NULL时,请考虑查看案例。

现在代码:

typedef struct List {
    char ch;
    int n;
    struct List *next;
} List;

void SwapNodeData( List* first, List* second )
{
    int  TempN;
    char TempCh;

    TempN      = first->n;
    TempCh     = first->ch;
    first->n   = second->n;
    first->ch  = second->ch;
    second->n  = TempN;
    second->ch = TempCh;
}

List* SortList(List* GeneralList)
{
    int   swapFlag;
    List* Current = NULL;

    do
    {
        swapFlag =0;
        for (Current = GeneralList; NULL != Current->next; Current = Current->next)
        {
            if (Current->ch > Current->next->ch)
            {
                SwapNodeData( Current, Current->next );
                swapFlag = 1;
            }
        }
    }
    while ( swapFlag );

    return GeneralList;
}