最近總結了一下針對只有頭結點的單鏈表進行排序的幾個簡單的方法。
交換節點:插入排序,氣泡排序,簡單選擇排序
交換資料:快速排序
#include #include #include //節點結構
struct node
;typedef struct node node, * list;
//列印函式
void printlist(list mylist);
//排序函式
//插入排序
void insertsort(list mylist);
//氣泡排序
void bubblesort(list mylist);
//簡單選擇
void selectsort(list mylist);
//快速排序
void quicksort(list mylist);
int main(void)
; //程式都是針對有頭結點的單向鍊錶
list mylist = (list)malloc(sizeof(node));
mylist -> val = 0;
mylist -> next = null;
int len = sizeof(arr) / sizeof(arr[0]);
int i = 0;
node * cur = mylist;
while(i < len)
//insertsort(mylist);
//bubblesort(mylist);
//selectsort(mylist);
quicksort(mylist);
printlist(mylist);
return 0;
}void printlist(list mylist)
printf("\n");
}
交換節點的情況比較複雜,所以我只是寫了比較簡單的三個。
1 、插入排序:
//**********===插入排序********************
void insertsort(list mylist)
node * head, * p1, * prep1, * p2, * prep2, * temp;
head = mylist;
prep1 = head -> next;
p1 = prep1 -> next;
//prep1和p1是否需要手動後移
bool flag;
while(p1 != null)
}
//手動後移prep1和p1
if(flag)
}
}//**********===插入排序********************
2、氣泡排序:
//**********===氣泡排序********************
void bubblesort(list mylist)
node *head, * pre, * cur, *next, * end, * temp;
head = mylist;
end = null;
//從煉表頭開始將較大值往後沉
while(head -> next != end)
}end = cur;
}}//**********===氣泡排序********************
簡單選擇排序:
//**********===簡單選擇排序***************=
void selectsort(list mylist)
node * head, * prep1, * p1, * prep2, * p2, * premin, * min, * temp;
head = mylist;
for(prep1 = head, p1 = prep1 -> next; p1 -> next != null; prep1 = prep1 -> next, p1 = prep1 -> next)
}if(p1 != min)
else}}
}//**********===簡單選擇排序***************=
交換資料的排序方式就特別簡單了,因為不用考慮前驅和後繼,只需要標記待交換的兩個節點即可。因此在這裡就直接介紹一下快速排序。
快速排序:
//**********===快速排序********************
//交換節點
void swap(node * a, node * b)
//求中間點
node * partion(node * start, node * end)
//取第乙個元素作為基準元素
node * p = start, * q = start, * refer = start;
//從start開始向後進行一次遍歷(因為是單鏈表,無法按從左右向中間遍歷的方法)
while(p != end)
q = q -> next;
}
swap(p, refer);
return p;
}//遞迴
void quick_sort(node * start, node * end)
node * mid = partion(start, end);
quick_sort(start, mid);
quick_sort(mid -> next, end);
}void quicksort(list mylist)
node * start = mylist -> next;
node * end = null;
quick_sort(start, end);
}//**********===快速排序********************
參考:
1、鍊錶的基本排序——c語言
2、單鏈表排序—-快排 & 歸併排序
鍊錶的基本排序 C語言
程式都是針對有頭結點的鍊錶進行排序 1.插入排序 需要用兩個指針對鍊錶進行遍歷,乙個指標用於標記待插入的節點 外迴圈 另乙個指標用於尋找插入位置 內迴圈 因為需要進行節點的刪除與插入,因此對用於遍歷的兩個指標,還需要再新增兩個前驅指標。node insertsortlist node l retur...
C語言 鍊錶資料的排序
c語言使用鍊錶時,有些時候會對鍊錶中的資料進行排序。下邊介紹使用鍊錶時可用的排序方法,氣泡排序和選擇排序。此鍊錶排序僅對鍊錶中的資料進行排序,如果想進行對整個結構體的排序,也就是利用資料順序來調整節點中的資訊,需要對節點進行交換,但與此方法不同,望讀者周知。node bubblesort node ...
c語言 鍊錶 C語言鍊錶例項 玩轉鍊錶
下圖為最一簡單鍊錶的示意圖 第 0 個結點稱為頭結點,它存放有第乙個結點的首位址,它沒有資料,只是乙個指標變數。以下的每個結點都分為兩個域,乙個是資料域,存放各種實際的資料,如學號 num,姓名 name,性別 和成績 score 等。另乙個域為指標域,存放下一結點的首位址。鍊錶中的每乙個結點都是同...