已知連續兩節點 p(前驅)、q(後繼),在兩者間插入新節點 s:
s 記憶體並賦值s->link = q(或 p->link)p->link = s順序關鍵:先連 s->link,再改 p->link,否則會丟失 q 位址。
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)
return p;
else
p = p->link;
}
if (p == NULL)
printf("沒有查找到該資料!\n");
return NULL;
}
void insert(stud *p) {
char stuname[20];
stud *s;
if ((s = (stud *)malloc(sizeof(stud))) == NULL) {
printf("記憶體配置失敗!");
exit(0);
}
printf("請輸入你要插入的人的姓名: ");
scanf("%s", stuname);
strcpy(s->name, stuname); // 複製姓名到新節點
s->link = p->link; // 1. 新節點指向原後繼
p->link = s; // 2. 前驅指向新節點
}
#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);
void insert(stud *p);
main() {
int number = N;
char fullname[20];
stud *head, *searchpoint;
head = creat(number);
printf("請輸入你要查找的人的姓名: ");
scanf("%s", fullname);
searchpoint = search(head, fullname);
if (searchpoint)
insert(searchpoint);
}
// 插入前:p → q
p → [name="Alice"][link=q]
q → [name="Bob"][link=...]
// 步驟 1:s->link = p->link (即 q)
s → [name="New"][link=q]
// 步驟 2:p->link = s
p → [name="Alice"][link=s]
s → [name="New"][link=q]
// 結果:p → s → q
s->name 為陣列,不可直接指派指標,需 strcpys->link),再斷舊連結(p->link)search 返回 stud*,insert 直接操作該節點h->name[0]='\0',資料從 h->link 開始| 類型 | 描述 | 關鍵差異 |
|---|---|---|
| 頭插 | 插入頭節點之後 | s->link = h->link; h->link = s; |
| 後插 | 指定節點之後(本例) | 需先查找前驅節點 |
| 尾插 | 插入鏈表末尾 | 需遍歷至尾節點或維護尾指標 |
| 有序插入 | 依值大小插入保持有序 | 查找插入位置 + 後插 |
| 前插 | 指定節點之前 | 單向鏈表需從頭找前驅,雙向鏈表 O(1) |