本站電子書

您可以在這些電子書店找到本站電子書: Google Play 圖書iBooks StoreHyReadReadmooPubu
===>>>本站推出學習遊戲意見調查<<<===《如何自學程式設計》入選 Google Play 台灣地區2016年度最佳書籍

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

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



基於這個想法的函數定義如下
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 進行排序



重新印出列表,如下



問題與討論
  1. 說明 lsort() 運作的方式。
  2. 有其他的設計方式嗎?例如更改指標的連結,而不是拷貝資料。




沒有留言: