這是一個經典的C語言課程設計項目:使用單鏈表動態管理學生信息,支持錄入、瀏覽、按學號查詢、退出釋放內存等功能。原代碼存在鏈表構建邏輯錯誤、顯示函數未正確遍歷、查詢邏輯缺陷等問題,經修復後可正常運行。
struct student {
long int num; // 學號
char name[20]; // 姓名
int age; // 年齡
char sex[4]; // 性別
char address[30]; // 籍貫
long int tele_num; // 電話
char E_mail[20]; // Email
struct student *next; // 指向下一節點
};
p1 追蹤最後節點,首節點賦給全局 head,循環末尾置 p1->next = NULL。p。修復為 if ((p = head) != NULL) 後用 do-while 遍歷。head==NULL 判斷,循環條件 while (num != p1->num && p1->next != NULL) 確保安全。p1=head; while(p1){ p2=p1->next; free(p1); p1=p2; } 正確。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(struct student)
struct student {
long int num; char name[20]; int age; char sex[4];
char address[30]; long int tele_num; char E_mail[20];
struct student *next;
};
int TOTAL_NUM = 0;
struct student *head = NULL;
// 函數聲明
void record(); void displayAll(); void query(); void query_by_num(); void freeAll();
int main() {
int choice = -1;
do {
printf("\n\t\t\t=== 學生信息管理系統 ===\n");
printf("\t\t\t[1] 錄入信息\n");
printf("\t\t\t[2] 瀏覽信息\n");
printf("\t\t\t[3] 查詢信息\n");
printf("\t\t\t[0] 退出系統\n");
printf("請選擇: "); scanf("%d", &choice);
switch(choice) {
case 1: record(); break;
case 2: displayAll(); break;
case 3: query(); break;
case 0: freeAll(); break;
default: printf("無效選項!\n");
}
} while(choice != 0);
return 0;
}
void record() {
struct student *p0, *p1 = NULL; char a; int i = 0;
do {
p0 = (struct student *)malloc(LEN);
printf("學號: "); scanf("%ld", &p0->num);
printf("姓名: "); scanf("%s", p0->name);
printf("年齡: "); scanf("%d", &p0->age);
printf("性別: "); scanf("%s", p0->sex);
printf("籍貫: "); scanf("%s", p0->address);
printf("電話: "); scanf("%ld", &p0->tele_num);
printf("Email: "); scanf("%s", p0->E_mail);
p0->next = NULL;
if (i == 0) head = p0;
else p1->next = p0;
p1 = p0; i++;
printf("繼續輸入? (y/n): "); scanf(" %c", &a);
} while(a == 'y' && i <= 50);
TOTAL_NUM = i;
}
void displayAll() {
struct student *p;
printf("學生總數: %d\n", TOTAL_NUM);
if ((p = head) != NULL) {
do {
printf("%ld\t%s\t%d\t%s\t%s\t%ld\t%s\n",
p->num, p->name, p->age, p->sex, p->address, p->tele_num, p->E_mail);
p = p->next;
} while(p != NULL);
}
printf("\n");
}
void query() {
int choice = -1;
do {
printf("\n[1] 按學號查詢 [0] 返回\n選擇: "); scanf("%d", &choice);
if (choice == 1) query_by_num();
} while(choice != 0);
}
void query_by_num() {
long int num; struct student *p1 = head;
printf("輸入查詢學號: "); scanf("%ld", &num);
if (head == NULL) { printf("無記錄!\n"); return; }
while (p1 != NULL && num != p1->num) p1 = p1->next;
if (p1) {
printf("學號\t姓名\t年齡\t性別\t籍貫\t電話\tEmail\n");
printf("%ld\t%s\t%d\t%s\t%s\t%ld\t%s\n",
p1->num, p1->name, p1->age, p1->sex, p1->address, p1->tele_num, p1->E_mail);
} else printf("未找到該生!\n");
}
void freeAll() {
struct student *p1 = head, *p2;
while (p1) { p2 = p1->next; free(p1); p1 = p2; }
head = NULL; TOTAL_NUM = 0;
}
系統運行界面與數據展示:
malloc/free 成對使用。do-while + switch 實現交互循環。scanf(" %c", &a) 前加空格跳過換行符。此系統是C語言指針、結構體、文件操作(可擴展)綜合應用的優秀實踐,建議在理解基礎上嘗試添加修改、刪除、文件存儲等功能。