單向鏈表存儲學生記錄(學號、姓名),支持:
typedef struct Student {
char id[12];
char name[20];
struct Student *next;
} Student;
插入前: head → [A] → [B] → [C] → NULL
↑
目標節點 A (學號匹配)
插入後: head → [A] → [NEW] → [B] → [C] → NULL
↑ ↑
目標 新節點
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student {
char id[12];
char name[20];
struct Student *next;
} Student;
Student *insert_after_id(Student *head) {
FILE *fp = fopen("student.txt", "wb"); // 覆寫模式
if (!fp) { perror("文件打開失敗"); return head; }
char target_id[12];
printf("輸入要插入在其後的學號: "); scanf("%11s", target_id);
Student *curr = head->next; // 跳過哨兵頭
Student *prev = head;
// 1. 遍歷尋找目標節點,同步寫入已遍歷部分
while (curr) {
fwrite(curr, sizeof(Student), 1, fp);
if (strcmp(curr->id, target_id) == 0) break;
prev = curr;
curr = curr->next;
}
if (!curr) { // 未找到
printf("未找到學號 %s\n", target_id);
// 寫入剩餘節點
while (curr) { fwrite(curr, sizeof(Student), 1, fp); curr = curr->next; }
fclose(fp);
return head;
}
// 2. 讀取新節點數據
Student *new_node = malloc(sizeof(Student));
printf("輸入新學號: "); scanf("%11s", new_node->id);
printf("輸入新姓名: "); scanf("%19s", new_node->name);
// 3. 鏈表插入操作
new_node->next = curr->next;
curr->next = new_node;
// 4. 寫入新節點
fwrite(new_node, sizeof(Student), 1, fp);
// 5. 寫入剩餘節點
curr = new_node->next;
while (curr) {
fwrite(curr, sizeof(Student), 1, fp);
curr = curr->next;
}
fclose(fp);
printf("插入成功並已同步到文件\n");
return head;
}
new_node->next = curr->next; // 1. 新節點指向原後繼 curr->next = new_node; // 2. 目標節點指向新節點
Student *create_sample_list() {
Student *head = calloc(1, sizeof(Student));
Student *tail = head;
const char *ids[] = {"1001", "1002", "1003"};
const char *names[] = {"張三", "李四", "王五"};
for (int i = 0; i < 3; i++) {
Student *n = malloc(sizeof(Student));
strcpy(n->id, ids[i]); strcpy(n->name, names[i]);
n->next = NULL; tail->next = n; tail = n;
}
// 初始化文件
FILE *fp = fopen("student.txt", "wb");
for (Student *p = head->next; p; p = p->next) fwrite(p, sizeof(Student), 1, fp);
fclose(fp);
return head;
}
void print_list(Student *head) {
for (Student *p = head->next; p; p = p->next)
printf("[%s] %s\n", p->id, p->name);
}
int main() {
Student *head = create_sample_list();
printf("原始鏈表:\n"); print_list(head);
head = insert_after_id(head);
printf("插入後鏈表:\n"); print_list(head);
return 0;
}
鏈表任意位置插入的核心是指針重連順序,配合邊遍歷邊持久化即可實現文件同步。關鍵模式:
// 1. 斷鏈插入(標準三步) new->next = target->next; target->next = new; // 2. 持久化同步 fwrite(已遍歷部分); fwrite(new_node); fwrite(剩餘部分);
掌握此模式,可擴展至刪除、修改、排序等所有鏈表更新操作的文件同步場景。