單鏈表是線性表的鏈式存儲結構,每個節點包含兩部分:數據域存儲實際數據(如姓名),鏈域/指針域存儲下一個節點的地址。節點在內存中可不連續分布,通過指針串聯形成邏輯順序。C語言中通過結構體自引用實現:
typedef struct node {
char name[20]; // 數據域:存儲姓名
struct node *link; // 鏈域:指向直接後繼節點
} stud;
創建過程遵循「申請空間→賦值數據→鏈接節點→移動工作指針」循環:
#include <stdio.h>
#include <malloc.h>
#define N 10
typedef struct node {
char name[20];
struct node *link;
} stud;
stud *creat(int n) {
stud *p, *h, *s;
int i;
/* 1. 創建頭節點 */
if ((h = (stud *)malloc(sizeof(stud))) == NULL) {
printf("內存分配失敗!\n");
exit(0);
}
h->name[0] = '\0'; // 頭節點數據域置空
h->link = NULL; // 頭節點鏈域置空
p = h; // p 指向當前鏈表尾部
/* 2. 循環創建數據節點 */
for (i = 0; i < n; i++) {
if ((s = (stud *)malloc(sizeof(stud))) == NULL) {
printf("內存分配失敗!\n");
exit(0);
}
p->link = s; // 將新節點掛到尾部
printf("請輸入第 %d 個人的姓名:", i + 1);
scanf("%s", s->name); // 數據域賦值
s->link = NULL; // 新節點鏈域置空
p = s; // p 後移到新尾部
}
return h; // 返回頭節點指針
}
int main() {
int number = N;
stud *head = creat(number); // 保存頭指針,後續所有操作從這裡開始
return 0;
}
h 獨立存在,p=h。s1,p->link=s1(即 h->link=s1),p=s1。s2,p->link=s2(即 s1->link=s2),p=s2。p 指向尾節點,尾節點 link=NULL。exit(0) 簡單處理,實際項目應返回錯誤碼或拋出異常。main() 中必須保存 creat() 返回的頭指針,否則整個鏈表無法訪問,造成內存洩漏。scanf("%s", ...) 存在緩衝區溢出風險,建議使用 fgets() 或限定寬度 scanf("%19s", ...)。不帶頭節點:首個數據節點即為頭指針,插入刪除需特判頭節點情況,代碼稍繁瑣。
尾插法 vs 頭插法:本文採用尾插法保持輸入順序;頭插法新節點插在頭節點後,順序與輸入相反,但無需維護尾指針。