建立鏈表後,核心基本運算包含:
本文專注查找演算法詳細實作。
h->link 開始NULL 仍未找到 → 返回 NULL關鍵:單向鏈表僅能順向遍歷,無法反向或隨機存取。
typedef struct node {
char name[20];
struct node *link;
} stud;
stud *creat(int n) {
stud *p, *h, *s;
int i;
if ((h = (stud *)malloc(sizeof(stud))) == NULL) {
printf("記憶體配置失敗!");
exit(0);
}
h->name[0] = '\0';
h->link = NULL;
p = h;
for (i = 0; i < n; i++) {
if ((s = (stud *)malloc(sizeof(stud))) == NULL) {
printf("記憶體配置失敗!");
exit(0);
}
p->link = s;
printf("請輸入第%d個人的姓名: ", i+1);
scanf("%s", s->name);
s->link = NULL;
p = s;
}
return h;
}
stud *search(stud *h, char *x) {
stud *p;
char *y;
p = h->link; // 從第一個資料節點開始
while (p != NULL) { // 未到達鏈表末尾
y = p->name;
if (strcmp(y, x) == 0) // 字串比較,相等返回 0
return p; // 找到,返回節點指標
else
p = p->link; // 移向下一節點
}
if (p == NULL)
printf("沒有查找到該資料!\n");
return NULL;
}
#include
#include
#include
#define N 10
typedef struct node {
char name[20];
struct node *link;
} stud;
stud *creat(int n);
stud *search(stud *h, char *x);
main() {
int number = N;
char fullname[20];
stud *head, *searchpoint;
head = creat(number);
printf("請輸入你要查找的人的姓名: ");
scanf("%s", fullname);
searchpoint = search(head, fullname);
// 後續可根據 searchpoint 進行插入、刪除等操作
}
頭節點 h → [name=""][link] → 節點1 → 節點2 → 節點3 → ... → NULL
↑
p (遍歷指標)
搜尋 "Bob":
p=節點1: strcmp("Alice","Bob")≠0 → p=p->link
p=節點2: strcmp("Bob","Bob")==0 → return 節點2 指標
#include strcmp(s1, s2):依 ASCII 逐字元比較| 變體 | 描述 | 適用場景 |
|---|---|---|
| 依值查找 | 比較資料域值 | 一般用途 |
| 依位置查找 | 移動指定步數 | 已知索引 |
| 查找前驅 | 返回目標前一節點 | 刪除、前插操作 |
| 查找最大/最小 | 遍歷記錄極值 | 統計分析 |
| 雙指標法 | 快慢指標找中點/環 | 進階演算法 |