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

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



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


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


addfriend() 的定義如下
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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() 的定義如下
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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. 如何在鏈結串列中找到正確的位置,然後把新節點加入?




沒有留言: