數組需預先固定長度,估算不準會導致內存浪費或溢出。鏈表通過動態內存分配(malloc),按需申請節點,節點在內存中可不連續,靈活高效。
核心結構:每個節點包含數據域與指針域(指向下一節點)。必須維護一個頭指針 以訪問首節點。
#include
#include
#define LEN sizeof(struct student)
struct student {
long num; // 學號
float score; // 成績
struct student *next; // 指向下一節點
};
採用尾插法,維護 head(頭指針)、p1(新節點)、p2(尾節點)三個指針。輸入 num=0 結束。
int n = 0; // 全局節點計數
struct student *creat(void) {
struct student *head = NULL;
struct student *p1, *p2;
p1 = p2 = (struct student *)malloc(LEN);
scanf("%ld,%f", &p1->num, &p1->score);
while (p1->num != 0) {
n++;
if (n == 1) {
head = p1; // 首節點
} else {
p2->next = p1; // 鏈接到尾部
}
p2 = p1; // 更新尾指針
p1 = (struct student *)malloc(LEN); // 分配下一節點
scanf("%ld,%f", &p1->num, &p1->score);
}
p2->next = NULL; // 尾節點指向 NULL
return head;
}

頭指針 head 指向首節點,各節點通過 next 串聯,最後一個節點 next = NULL。
malloc 動態分配,必須檢查返回值(教學代碼省略,生產代碼必須判空)。p2,避免每次遍歷到尾部(O(1) vs O(n))。num=0),實際項目中可改為計數或文件 EOF。free 遍歷釋放)。int main() {
struct student *head = creat();
// 此處可調用打印、插入、刪除等操作
// 最後釋放鏈表內存
struct student *p = head;
while (p) {
struct student *tmp = p;
p = p->next;
free(tmp);
}
return 0;
}
下一篇將講解鏈表的遍歷打印操作。