似乎只需要把 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; } } } |
嗯,內容幾乎也都一樣。
完整的範例程式碼、編譯執行及結果說明,請繼續參考
問題與討論
- 說明鏈結串列建立第一個節點的方式。
- 如何在鏈結串列中找到正確的位置,然後把新節點加入?
沒有留言:
張貼留言