基於這個想法的函數定義如下
void lsort(LinkedListNode *startPtr)
{
LinkedListNode *tempPtr, *onePtr, *twoPtr;
if (startPtr == NULL) {
printf("\n還沒有建立任何好友資料唷...\n\n");
}
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好友名錄排序完成...\n\n");
}
}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() 運作的方式。
- 有其他的設計方式嗎?例如更改指標的連結,而不是拷貝資料。
沒有留言:
張貼留言