C 語言初學教材 - 第六章 排序列表
- Get link
- X
- Other Apps
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 進行排序

重新印出列表,如下

問題與討論
- 說明 lsort() 運作的方式。
- 有其他的設計方式嗎?例如更改指標的連結,而不是拷貝資料。
window.___gcfg = { 'lang': 'zh-TW' };
- Get link
- X
- Other Apps