C 語言初學教材 - 第六章 排序列表







































C 語言初學教材 - 第六章 排序列表






我們打算也用氣泡排序法替鏈結串列排序,至於兩個節點調換的方式,簡單點的想法就是用一個暫存的結構,先把前一個節點的資料拷貝到暫存的結構,然後把後一個節點的資料拷貝到前一個節點,最後把暫存結構中的資料拷貝回後一個節點。



基於這個想法的函數定義如下
void lsort(LinkedListNode *startPtr)
{
LinkedListNode *tempPtr, *onePtr, *twoPtr;

if (startPtr == NULL) {
printf("n還沒有建立任何好友資料唷...nn");
}
else {
tempPtr = malloc(sizeof(LinkedListNode));

onePtr = startPtr;
twoPtr = startPtr->nextPtr;
while (onePtr != NULL) {
while (twoPtr != NULL) {
if (onePtr->data.name[0] > twoPtr->data.name[0]) {
strcpy(tempPtr->data.name, twoPtr->data.name);
tempPtr->data.age = twoPtr->data.age;
tempPtr->data.sex = twoPtr->data.sex;
tempPtr->data.relation = twoPtr->data.relation;

strcpy(twoPtr->data.name, onePtr->data.name);
twoPtr->data.age = onePtr->data.age;
twoPtr->data.sex = onePtr->data.sex;
twoPtr->data.relation = onePtr->data.relation;

strcpy(onePtr->data.name, tempPtr->data.name);
onePtr->data.age = tempPtr->data.age;
onePtr->data.sex = tempPtr->data.sex;
onePtr->data.relation = tempPtr->data.relation;
}
twoPtr = twoPtr->nextPtr;
}

if (onePtr->nextPtr == NULL) {
break;
}
else {
onePtr = onePtr->nextPtr;
twoPtr = onePtr->nextPtr;
}
}

printf("n好友名錄排序完成...nn");
}
}



onePtr 及 twoPtr 為遊走在鏈結串列中的指標變數,由於 onePtr->nextPtr 應該指向 twoPtr ,因此若是 onePtr->nextPtr 指向 NULL ,執行時會造成 Bus error ,所以如果 onePtr->nextPtr 等於 NULL ,這時候利用 break 陳述跳出迴圈,不然程式無法順利執行。


注意,我們並沒有以雙重指標當參數,因為這個設計方式簡單的做資料拷貝,不會更動到已存在每個節點的指標,自然也不用修改 frienddata() 中 startPtr 的值。


別忘了,新的函數 lsort() 的定義要加入 itmf.c 中,而函數原型要宣告在 itm.h 內
void lsort(LinkedListNode *startPtr);



編譯執行,假設已加入以下資料



輸入 5 進行排序



重新印出列表,如下



問題與討論

  1. 說明 lsort() 運作的方式。

  2. 有其他的設計方式嗎?例如更改指標的連結,而不是拷貝資料。


























window.___gcfg = { 'lang': 'zh-TW' };





Popular posts from this blog

迅雷 Thunder 7.9.43.5054 免安裝版 (9.1.41.914 安裝版) - 支援BT下載的萬用 檔案下載工具

qBittorrent 4.1.1 免安裝中文版 - 取代uTorrent的BT下載器

嘸蝦米輸入法免安裝版 1.0.13.589 - 唯一只用英文字母輸入的中文輸入法