我正在尝试对链接列表进行排序,但我无法做到。我不需要交换节点。 我试图使用类似数组的排序算法解决问题,但它不正确
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;
}
答案 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
语句中移动,就在实际交换之后。for
循环应在列表未结束时运行。情况也相应改变了。我认为你应该考虑的变化:
foo()
而不是这样:foo ()
。此外,更具可读性。#DEFINE
来使用TRUE
和FALSE
而不是1
和0
。更方便。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;
}