前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >附完整源码 | C语言实现学生信息管理系统

附完整源码 | C语言实现学生信息管理系统

作者头像
C语言中文社区
发布2025-06-26 09:32:29
发布2025-06-26 09:32:29
17300
代码可运行
举报
文章被收录于专栏:C语言中文社区C语言中文社区
运行总次数:0
代码可运行

正文

文末附完整源代码

1. 引言

1.1 系统概述

学生信息管理系统是一个用于管理学生基本信息的程序,通过链表数据结构实现学生信息的增删改查功能。系统采用C语言编写,具有良好的模块化设计和可扩展性。

1.2 系统目标

  • 实现学生信息的添加、删除、修改和查询功能
  • 使用链表作为主要数据结构,方便动态管理学生信息
  • 提供友好的用户交互界面
  • 确保系统的稳定性和内存安全性

2. 系统设计

2.1 数据结构设计

系统使用单链表来存储学生信息,每个节点包含以下字段:

  • id: 学生唯一标识
  • name: 学生姓名
  • age: 学生年龄
  • score: 学生成绩
  • next: 指向下一个学生节点的指针

2.2 模块设计

系统主要分为以下几个模块:

  1. 学生节点管理模块:负责创建和销毁学生节点
  2. 链表操作模块:负责链表的增删改查操作
  3. 用户交互模块:负责接收用户输入并显示操作结果
  4. 主控制模块:负责程序流程的控制和模块协调

2.3 功能设计

系统提供以下核心功能:

  • 添加学生:向系统中添加新的学生信息
  • 删除学生:根据学生ID删除对应的学生信息
  • 更新学生信息:根据学生ID更新学生的姓名、年龄或成绩
  • 查找学生:根据学生ID查找并显示学生信息
  • 显示所有学生:显示系统中所有学生的信息

3. 详细设计

3.1 数据结构实现

代码语言:javascript
代码运行次数:0
运行
复制
typedef struct Student {
    int id;             // 学生ID
    char name[50];      // 学生姓名
    int age;            // 学生年龄
    float score;        // 学生成绩
    struct Student* next; // 指向下一个学生节点的指针
} Student;

3.2 核心函数实现

3.2.1 创建学生节点
代码语言:javascript
代码运行次数:0
运行
复制
Student* createStudent(int id, const char* name, int age, float score);
  • 功能:创建一个新的学生节点并初始化其数据
  • 参数:学生ID、姓名、年龄和成绩
  • 返回值:指向新创建节点的指针
3.2.2 添加学生
代码语言:javascript
代码运行次数:0
运行
复制
void addStudent(int id, const char* name, int age, float score);
  • 功能:将新学生添加到链表尾部
  • 参数:学生ID、姓名、年龄和成绩
  • 返回值:无
3.2.3 删除学生
代码语言:javascript
代码运行次数:0
运行
复制
void deleteStudent(int id);
  • 功能:根据学生ID从链表中删除对应的节点
  • 参数:学生ID
  • 返回值:无
3.2.4 更新学生信息
代码语言:javascript
代码运行次数:0
运行
复制
void updateStudent(int id, const char* name, int age, float score);
  • 功能:根据学生ID更新学生的姓名、年龄或成绩
  • 参数:学生ID、新姓名、新年龄、新成绩
  • 返回值:无
3.2.5 查找学生
代码语言:javascript
代码运行次数:0
运行
复制
Student* findStudent(int id);
  • 功能:根据学生ID查找对应的节点
  • 参数:学生ID
  • 返回值:找到返回节点指针,未找到返回NULL
3.2.6 显示所有学生
代码语言:javascript
代码运行次数:0
运行
复制
void displayAllStudents();
  • 功能:遍历链表并显示所有学生信息
  • 参数:无
  • 返回值:无

3.3 主程序流程

  1. 显示主菜单,等待用户选择操作
  2. 根据用户选择执行相应的功能
  3. 执行完功能后返回主菜单,直到用户选择退出
  4. 程序退出前释放链表占用的所有内存

4. 内存管理

  • 使用malloc()为新节点分配内存
  • 使用free()释放删除节点的内存
  • 程序退出前调用freeList()函数释放所有节点的内存,防止内存泄漏

5. 错误处理

  • 内存分配失败时会输出错误信息并终止程序
  • 执行操作时会检查输入的有效性(如ID是否存在)
  • 对无效的用户输入会给出相应的提示

6. 使用说明

  1. 运行程序后会显示主菜单
  2. 根据菜单提示输入对应的数字选择操作
  3. 按照提示输入相应的学生信息
  4. 可以随时选择退出程序,系统会自动释放占用的内存

7. 测试结果

代码语言:javascript
代码运行次数:0
运行
复制
学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:1
请输入学生ID:1001
请输入学生姓名:张三
请输入学生年龄:18
请输入学生成绩:99
成功添加学生:张三 (ID: 1001)

学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:1
请输入学生ID:1002
请输入学生姓名:李四
请输入学生年龄:20
请输入学生成绩:89
成功添加学生:李四 (ID: 1002)

学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:5
========================================
ID      姓名    年龄    成绩
========================================
1001    张三    18      99.00
1002    李四    20      89.00
========================================

学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:4
请输入要查找的学生ID:1002
========================================
ID:1002
姓名:李四
年龄:20
成绩:89.00
========================================

学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:3
请输入要更新的学生ID:1001
请输入新姓名:张三丰
请输入新年龄:99
请输入新成绩:88
成功更新ID为1001的学生信息!

学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:5
========================================
ID      姓名    年龄    成绩
========================================
1001    张三丰  99      88.00
1002    李四    20      89.00
========================================

学生信息管理系统
========================
1. 添加学生
2. 删除学生
3. 更新学生信息
4. 查找学生
5. 显示所有学生
6. 退出
========================
请输入你的选择:

8. 完整代码

代码语言:javascript
代码运行次数:0
运行
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生结构体
typedef struct Student {
    int id;             // 学生ID
    char name[50];      // 学生姓名
    int age;            // 学生年龄
    float score;        // 学生成绩
    struct Student* next; // 指向下一个学生节点的指针
} Student;

// 全局头指针,指向链表的第一个节点
Student* head = NULL;

// 函数声明
Student* createStudent(int id, const char* name, int age, float score);
void addStudent(int id, const char* name, int age, float score);
void deleteStudent(int id);
void updateStudent(int id, const char* name, int age, float score);
Student* findStudent(int id);
void displayAllStudents();
void freeList();

// 创建新学生节点
Student* createStudent(int id, const char* name, int age, float score) {
    // 为新节点分配内存
    Student* newStudent = (Student*)malloc(sizeof(Student));
    if (newStudent == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }

    // 初始化节点数据
    newStudent->id = id;
    strcpy(newStudent->name, name);
    newStudent->age = age;
    newStudent->score = score;
    newStudent->next = NULL;

    return newStudent;
}

// 添加学生到链表
void addStudent(int id, const char* name, int age, float score) {
    // 检查ID是否已存在
    if (findStudent(id) != NULL) {
        printf("ID为%d的学生已存在!\n", id);
        return;
    }

    Student* newStudent = createStudent(id, name, age, score);

    // 如果链表为空,新节点即为头节点
    if (head == NULL) {
        head = newStudent;
    }
    else {
        // 找到链表尾部
        Student* current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        // 将新节点添加到尾部
        current->next = newStudent;
    }

    printf("成功添加学生:%s (ID: %d)\n", name, id);
}

// 根据ID删除学生
void deleteStudent(int id) {
    Student* current = head;
    Student* previous = NULL;

    // 查找要删除的节点
    while (current != NULL && current->id != id) {
        previous = current;
        current = current->next;
    }

    // 如果未找到该ID的学生
    if (current == NULL) {
        printf("未找到ID为%d的学生!\n", id);
        return;
    }

    // 删除头节点的情况
    if (previous == NULL) {
        head = current->next;
    }
    else {
        // 普通情况,将前一个节点的next指向当前节点的next
        previous->next = current->next;
    }

    // 释放被删除节点的内存
    free(current);
    printf("成功删除ID为%d的学生!\n", id);
}

// 根据ID更新学生信息
void updateStudent(int id, const char* name, int age, float score) {
    Student* student = findStudent(id);

    if (student == NULL) {
        printf("未找到ID为%d的学生!\n", id);
        return;
    }

    // 更新学生信息
    if (name != NULL) {
        strcpy(student->name, name);
    }
    if (age != -1) {
        student->age = age;
    }
    if (score != -1) {
        student->score = score;
    }

    printf("成功更新ID为%d的学生信息!\n", id);
}

// 根据ID查找学生
Student* findStudent(int id) {
    Student* current = head;

    // 遍历链表查找学生
    while (current != NULL) {
        if (current->id == id) {
            return current;
        }
        current = current->next;
    }

    return NULL; // 未找到返回NULL
}

// 显示所有学生信息
void displayAllStudents() {
    Student* current = head;

    if (current == NULL) {
        printf("暂无学生信息!\n");
        return;
    }

    printf("========================================\n");
    printf("ID\t姓名\t年龄\t成绩\n");
    printf("========================================\n");

    while (current != NULL) {
        printf("%d\t%s\t%d\t%.2f\n",
            current->id, current->name, current->age, current->score);
        current = current->next;
    }

    printf("========================================\n");
}

// 释放链表占用的所有内存
void freeList() {
    Student* current = head;
    Student* next;

    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }

    head = NULL;
}

// 主函数
int main() {
    int choice, id, age;
    char name[50];
    float score;
    Student* student;

    while (1) {
        printf("\n学生信息管理系统\n");
        printf("========================\n");
        printf("1. 添加学生\n");
        printf("2. 删除学生\n");
        printf("3. 更新学生信息\n");
        printf("4. 查找学生\n");
        printf("5. 显示所有学生\n");
        printf("6. 退出\n");
        printf("========================\n");
        printf("请输入你的选择:");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            printf("请输入学生ID:");
            scanf("%d", &id);
            printf("请输入学生姓名:");
            scanf("%s", name);
            printf("请输入学生年龄:");
            scanf("%d", &age);
            printf("请输入学生成绩:");
            scanf("%f", &score);
            addStudent(id, name, age, score);
            break;

        case 2:
            printf("请输入要删除的学生ID:");
            scanf("%d", &id);
            deleteStudent(id);
            break;

        case 3:
            printf("请输入要更新的学生ID:");
            scanf("%d", &id);

            // 输入要更新的信息
            printf("请输入新姓名:");
            scanf("%s", name);
            printf("请输入新年龄:");
            scanf("%d", &age);
            printf("请输入新成绩:");
            scanf("%f", &score);

            updateStudent(id, name, age, score);
            break;

        case 4:
            printf("请输入要查找的学生ID:");
            scanf("%d", &id);
            student = findStudent(id);
            if (student != NULL) {
                printf("========================================\n");
                printf("ID:%d\n", student->id);
                printf("姓名:%s\n", student->name);
                printf("年龄:%d\n", student->age);
                printf("成绩:%.2f\n", student->score);
                printf("========================================\n");
            }
            else {
                printf("未找到ID为%d的学生!\n", id);
            }
            break;

        case 5:
            displayAllStudents();
            break;

        case 6:
            freeList(); // 释放链表内存
            printf("感谢使用学生信息管理系统,再见!\n");
            return 0;

        default:
            printf("无效的选择,请重新输入!\n");
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
    • 1. 引言
      • 1.1 系统概述
      • 1.2 系统目标
    • 2. 系统设计
      • 2.1 数据结构设计
      • 2.2 模块设计
      • 2.3 功能设计
    • 3. 详细设计
      • 3.1 数据结构实现
      • 3.2 核心函数实现
      • 3.3 主程序流程
    • 4. 内存管理
    • 5. 错误处理
    • 6. 使用说明
    • 7. 测试结果
    • 8. 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档