基於這個想法的函數定義如下
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() 運作的方式。
- 有其他的設計方式嗎?例如更改指標的連結,而不是拷貝資料。
沒有留言:
張貼留言