单链表排序——交换数据成员
仿冒泡函数,对一个Words型结构体链表排序,全部代码[单链表]统计文本中英文单词出现次数,并输出前200个单词及其出现次数
void WordsSort(Words *headWord)
{
if(headWord->next == NULL) return; //链表为空无法排序
Words *flg_word = NULL; //标记,每次循环结束时指向本次循环的最大值地址,同时也可做终止条件,仿冒泡
int flag; //优化冒泡,标记是否发生了交换
while(flg_word != headWord->next) //类似于冒泡排序中内循环的条件语句 j<n-i-1
{ //或flg_word > headWord->next
flag = 0;
Words *pos = headWord->next; //当前 pos[j]
Words *pos_next = pos->next; //下一个 pos[j+1]
while(pos_next != NULL) //条件基本用不上,可写为死循环
{
if(pos->count < pos_next->count)
{
SwapWord(pos,pos_next); //交换数据函数
flag = 1;
}
if(pos_next->next == flg_word)
{
flg_word = pos_next; //相当于flg_word每次向前移动一个位置
break; //提前退出,后面的已经有序
}
pos = pos->next;
pos_next = pos_next->next;
}
if(flag == 0) break; //没有交换,该链表(数列……)已为有序,无需再排序
}
}