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

C/C++ 學習之路(第 10 課):結構體鏈結串列實作學生成績管理系統

     編輯:關於C語言

專案目標

運用結構體 + 鏈結串列實作動態學生資料管理:新增、查詢、修改、刪除。因學生人數不定,陣列固定大小不夠彈性,鏈結串列是經典解法。

資料結構定義

typedef struct Student {
    char no[4];       // 學號 (3 碼)
    char name[10];    // 姓名
    int chinese;      // 國文
    int math;         // 數學
    int english;      // 英文
    struct Student *next; // 指向下一筆
} StudentList;

核心功能模組

1. 初始化表頭 init()

void init(StudentList *&stuList) {
    stuList = (StudentList *)malloc(sizeof(StudentList));
    stuList->next = NULL; // 空串列
}

2. 新增資料 insert() — 尾插法

void insert(StudentList *&stuList) {
    StudentList *p = stuList, *s;
    while (p->next != NULL) p = p->next; // 找尾節點
    do {
        s = (StudentList *)malloc(sizeof(StudentList));
        puts("please insert student data(NO,Name,Chinese,Math,English):");
        scanf("%3s%10s", &s->no, &s->name);
        scanf("%d%d%d", &s->chinese, &s->math, &s->english);
        // 簡易驗證:分數 0-100
        if (s->chinese < 0 || s->chinese > 100 || ...) { puts("input data error !!!"); return; }
        s->next = NULL;
        p->next = s; p = p->next; // 掛上新節點,移動尾標
        fflush(stdin);
        puts("Continue? ENTER to yes or input no to exit");
    } while (getchar() == '\n');
}

3. 查詢顯示 select() — 遍歷列印

void select(StudentList *stuList) {
    StudentList *p = stuList->next;
    if (!p) { puts("there is no data,please insert!!"); getchar(); return; }
    puts("No\tName\tChinese\tMath\tEnglish");
    while (p) { printf("%s\t%s\t%d\t%d\t%d\n", p->no, p->name, p->chinese, p->math, p->english); p = p->next; }
    getchar();
}

4. 修改資料 update() — 依學號搜尋後覆寫

void update(StudentList *&stuList) {
    StudentList *p = stuList->next;
    char no[4]; gets(no);
    while (p && strcmp(p->no, no)) p = p->next; // 找節點
    if (!p) { puts("can't find this student's record!!!"); getchar(); return; }
    // 顯示舊資料後輸入新資料 (不含學號)
    puts("please update student data(Name,Chinese,Math,English):");
    scanf("%10s", &p->name); scanf("%d%d%d", &p->chinese, &p->math, &p->english);
    puts("update successful");
}

5. 刪除資料 deleteData() — 經典前驅節點法

void deleteData(StudentList *stuList) {
    StudentList *p = stuList, *q; // p 指向前驅
    char no[4]; gets(no);
    while (p->next && strcmp(p->next->no, no)) p = p->next;
    if (!p->next) { puts("can't find..."); getchar(); return; }
    puts("Are you sure delete? press ENTER to confirm");
    if (getchar() == '\n') {
        q = p->next; p->next = q->next; free(q); // 斷鏈 + 釋放
        puts("delete successful");
    }
    getchar();
}

主選單整合

void studentScoreManege() {
    StudentList *stuList = NULL; int oprate;
    init(stuList);
    do {
        system("cls"); // 清屏
        puts("1. select  2. insert  3. update  4. delete  0. exit");
        scanf("%d", &oprate);
        switch (oprate) {
            case 1: select(stuList); break;
            case 2: insert(stuList); break;
            case 3: update(stuList); break;
            case 4: deleteData(stuList); break;
        }
    } while (oprate != 0);
}

已知限制與改進方向

  • 學號固定 3 碼 (char no[4]),輸入超長會緩衝區溢位 → 改用動態配置或 fgets + 長度檢查
  • 刪除功能僅支援單筆刪除,無批次/全部刪除
  • 無學號唯一性檢查,可能重複
  • 無檔案持久化,程式結束資料消失 → 加入 save/load 至二進位/文字檔
  • system("cls")、fflush(stdin) 非標準 C,跨平台需替換

學習價值

這是典型的「資料結構 + 標準 I/O + 選單驅動」綜合練習。完整打通後,你將掌握:動態記憶體管理、指標多重間接存取、鏈結串列四大操作 (增刪改查)、使用者互動流程控制。建議以此為基礎,逐步加入上述改進,演化成完整的專案作品集。

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