本站電子書

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

C 語言初學教材 - 第六章 增加好友

我們現在要用函數來處理鏈結串列,也就是把增加好友及印出好友列表分別規劃成不同的函數。想法很簡單,我們需要把記錄鏈結串列起點的 startPtr 留在函數 main() ,也就是把函數劃分為各種不同的功能,處理資料結構為專屬的函數,新增節點則是另外的函數。



似乎只需要把 startPtr 參數就可以了,不是嗎?基於這個想法,函數原型宣告如下
void addfriend(LinkedListNode *startPtr);
void printList(LinkedListNode *startPtr);


函數 addfriend() 為新增好友資料, printList() 則為印出好友資料的列表,兩者都以指向結構 linkedListNode 的指標當作參數。這裡,參數名稱也取為 startPtr ,也表示呼叫這兩個函數時,直接以 main() 所宣告的 startPtr 當參數即可。


addfriend() 的定義如下
void addfriend(LinkedListNode *startPtr)
{
    LinkedListNode *newPtr, *currentPtr;
    char fname[NAME_SIZE];
    int fage, fsex, frelation;

    // 向作業系統要求新的記憶體空間
    newPtr = malloc(sizeof(LinkedListNode));
        
    // 依序輸入好友資料
    printf("\n好友暱稱: ");
    scanf("%s", fname);
    printf("好友年齡: ");
    scanf("%d", &fage);
    printf("好友性別 - 0.女 1.男: ");
    scanf("%d", &fsex);
    printf("好友關係 - 0.家人 1.同學 2.朋友: ");
    scanf("%d", &frelation); 
        
    // 將好友資料拷貝到剛才取得的記憶體空間之中
    strcpy(newPtr->data.name, fname);
    newPtr->data.age = fage;
    newPtr->data.sex = fsex;
    newPtr->data.relation = frelation;
    newPtr->nextPtr = NULL;
        
    // 將資料加入鏈結串列
    if (startPtr == NULL) {
        startPtr = newPtr;
    }
    else {
        currentPtr = startPtr;
           
        while (currentPtr != NULL) {
           if (currentPtr->nextPtr == NULL) {
               currentPtr->nextPtr = newPtr;
               break;
           }
                       
           currentPtr = currentPtr->nextPtr;
        }
    }
}


內容幾乎一樣,除了大部分變數都變成 addfriend() 內的區域變數。 printList2() 的定義如下
void printList2(LinkedListNode *currentPtr)
{
    if (currentPtr == NULL) {
        printf("\n\n還沒有建立任何好友資料唷...\n\n");
    }
    else {
        // 依序由鏈結串獵取出資料,然後印在螢幕上
        printf("\n\n以下依好友名錄的儲存順序印出好友資料\n");
        printf("  好友暱稱 - 年 齡 - 性 別 - 關 係\n");
        while (currentPtr != NULL) {
            printf("%10s - ", currentPtr->data.name);
            printf("%5d - ", currentPtr->data.age);
            printf("%5s  - ", currentPtr->data.sex ? "男" : "女");
            printf("%s \n", currentPtr->data.relation ? "同學或朋友" : "家人");
        
            currentPtr = currentPtr->nextPtr;
        }
    }
        
}


嗯,內容幾乎也都一樣。


完整的範例程式碼、編譯執行及結果說明,請繼續參考


問題與討論
  1. 說明鏈結串列建立第一個節點的方式。
  2. 如何在鏈結串列中找到正確的位置,然後把新節點加入?




沒有留言: