首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言學生信息管理系統:鏈表實現完整代碼與Bug修復詳解

     編輯:C 語言問答

基於單鏈表的學生信息管理系統(含完整修正代碼)

這是一個經典的C語言課程設計項目:使用單鏈表動態管理學生信息,支持錄入、瀏覽、按學號查詢、退出釋放內存等功能。原代碼存在鏈表構建邏輯錯誤、顯示函數未正確遍歷、查詢邏輯缺陷等問題,經修復後可正常運行。

系統功能模塊

  • 錄入信息:鍵盤輸入學號、姓名、年齡、性別、籍貫、電話、Email,尾插法建立鏈表。
  • 瀏覽所有:遍歷鏈表輸出所有學生信息,顯示總數。
  • 查詢信息:按學號查找並顯示該生詳細信息。
  • 退出系統:釋放鏈表所有節點內存,避免洩漏。

核心數據結構

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; // 指向下一節點
};

關鍵Bug修復點

  1. record() 錄入函數:原代碼未正確鏈接節點,導致鏈表斷裂。修復採用尾指針 p1 追蹤最後節點,首節點賦給全局 head,循環末尾置 p1->next = NULL。
  2. displayAll() 瀏覽函數:原代碼未初始化遍歷指針 p。修復為 if ((p = head) != NULL) 後用 do-while 遍歷。
  3. query_by_num() 查詢函數:原代碼查找邏輯在鏈表為空或未找到時可能越界。修復增加 head==NULL 判斷,循環條件 while (num != p1->num && p1->next != NULL) 確保安全。
  4. 內存釋放 freeAll():標準釋放模式 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語言指針、結構體、文件操作(可擴展)綜合應用的優秀實踐,建議在理解基礎上嘗試添加修改、刪除、文件存儲等功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved