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

C 語言課程設計全紀錄:指針、鏈表與學生管理系統實戰

     編輯:關於C

第一部分:指針核心概念深度解析

指針本質:地址與內容的關係

  • 內存單元:每個字節一個編號(地址)
  • 指針 = 地址 = 常量
  • 指針變量 = 存儲地址的變量 = 可變
  • 銀行比喻:賬號 = 指針,存款單 = 內存單元,金額 = 內容

指針、引用、取值三者關係

操作符聲明時使用時
*聲明指針變量解引用(取值)
&—取地址(引用)
int *ptr = &val;  // ptr 存儲 val 的地址
*ptr = 20;        // 通過指針修改 val 的值

比喻:指針=信封,地址=郵箱地址,取值=房子。擦掉信封地址換新地址,不影響原房子。

指針與數組

  • 數組名 = 首元素地址(常量,不可修改)
  • 指針變量 = 可修改的地址變量
  • arr 不能作左值,ptr = arr 合法(實為 ptr = &arr[0])

指針與結構體

struct Person { int age; char *name; };
struct Person p = {25, "Tom"};
struct Person *ptr = &p;
ptr->age = 26;        // 等價於 (*ptr).age
ptr->name = "Jerry";
  • . 用於結構體變量
  • -> 用於結構體指針

第二部分:鏈表數據結構與操作

鏈表特點

  • 物理不連續,邏輯連續
  • 節點 = 數據域 + 指針域
  • 插入/刪除 O(1),查找/訪問 O(n)
  • 動態內存管理靈活,但空間開銷大(指針域)

核心操作代碼精華

創建鏈表(尾插法)

Node* Create() {
    Node *head = NULL, *p1, *p2;
    p1 = p2 = (Node*)malloc(sizeof(Node));
    scanf("%d", &p1->data);
    while (p1->data != 0) {
        if (head == NULL) head = p1;
        else p2->next = p1;
        p2 = p1;
        p1 = (Node*)malloc(sizeof(Node));
        scanf("%d", &p1->data);
    }
    p2->next = NULL;
    return head;
}

插入節點

void insert(Node *head, int pos, int val) {
    Node *tmp = head;
    for (int i = 0; i < pos; i++) {
        if (tmp == NULL) return;
        if (i < pos - 1) tmp = tmp->next;
    }
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = val;
    newNode->next = tmp->next;
    tmp->next = newNode;
}

刪除節點

int del(Node *head, int pos) {
    Node *tmp = head;
    for (int i = 0; i < pos; i++) {
        if (tmp == NULL) return -1;
        if (i < pos - 1) tmp = tmp->next;
    }
    int val = tmp->next->data;
    tmp->next = tmp->next->next;
    free(tmp->next);  // 注意:應先保存再 free
    return val;
}

第三部分:學生信息管理系統(完整實現)

系統功能模塊

  • 文件讀取/保存(data.txt)
  • 學生增刪改查
  • 按學號/班級/全校統計:平均分、及格率、優秀率
  • 多級排序:班級升序 + 總分降序
  • 菜單驅動交互界面

核心數據結構

struct Score { int chinese, math, english, sum; };
struct Node {
    char name[20], class[20], number[20];
    struct Score score;
    struct Node *next;
} *head, *p, *q, *u;

關鍵算法實現

冒泡排序(班級升序、總分降序)

void Sort() {
    // 統計節點數 n
    for (int i = 1; i <= n; i++) {
        u = head;
        for (int j = 0; j < n - i; j++) {
            p = u->next; q = p->next;
            if (strcmp(p->class, q->class) > 0 || 
                (strcmp(p->class, q->class) == 0 && p->score.sum < q->score.sum)) {
                u->next = q;
                p->next = q->next;
                q->next = p;
            }
            u = u->next;
        }
    }
}

文件持久化

void Save() {
    FILE *fp = fopen("C:\\data.txt", "w");
    fprintf(fp, "班級 學號 姓名 語文 數學 英語 總成績\n");
    for (u = head->next; u; u = u->next)
        fprintf(fp, "%-11s%-11s%-15s%-6d%-6d%-6d%-d\n",
                u->class, u->number, u->name,
                u->score.chinese, u->score.math, u->score.english, u->score.sum);
    fclose(fp);
}

第四部分:學習心得與體會

「通過指針和鏈表的學習,發現 C 語言可以如此有意思、如此有成就感。同一個系統可以有多種實現方式,靈活運用指針實現動態內存管理,是 C 語言獨特的魅力所在。」

代碼規範建議

  1. 統一縮進風格(4 空格)
  2. 添加必要錯誤檢查(malloc 返回值、文件打開狀態)
  3. 避免全局變量濫用,封裝為模塊
  4. 使用 const 修飾只讀參數
  5. 釋放內存後置指針為 NULL
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved