8.18练习二

学生信息管理系统

代码概述

学生信息管理系统,使用了单链表数据结构来存储和管理学生的信息。系统包括录入、删除、查找、修改、显示学生信息等功能。主要由头文件定义、功能函数实现和主程序组成。

头文件 student.h
c 复制代码
#ifndef STUDENT_H
#define STUDENT_H
#include <myhead.h>

typedef struct Stu {
    char name[50];  // 学生姓名,长度为50
    int score;      // 学生分数
    int age;        // 学生年龄
    char phone[15]; // 学生电话,长度为15
} Stu;

typedef struct Node {
    Stu stu;       // 学生信息
    int len;       // 链表长度
    struct Node *next;  // 链表指针
} Node, *PNode;

// 函数声明
PNode create_list(void);
void inputstu(PNode L);
void delstu(PNode L);
void modstu(PNode L);
void search_name(PNode L);
void show_stu(PNode L);

#endif
  • Stu 结构体: 存储学生的基本信息,包括姓名、分数、年龄和电话。
  • Node 结构体 : 链表节点,包含学生信息 (Stu)、链表长度 (len),以及指向下一个节点的指针 (next)。
  • 函数声明: 提供了创建链表、录入、删除、修改、查找和显示学生信息的功能。
功能函数实现
c 复制代码
#include "stu.h"

// 创建链表并初始化
PNode create_list(void) {
    PNode L = (PNode)malloc(sizeof(Node));
    if (L == NULL) {
        printf("内存分配失败。\n");
        exit(1);
    }
    L->next = NULL;  // 初始化链表头指针为空
    L->len = 0;      // 初始化链表长度为0
    return L;
}

// 录入学生信息
void inputstu(PNode L) {
    PNode p = (PNode)malloc(sizeof(Node));
    if (p == NULL) {
        printf("内存分配失败。\n");
        exit(1);
    }

    printf("请输入学生的姓名: ");
    scanf("%s", p->stu.name);
    printf("请输入学生的分数: ");
    scanf("%d", &p->stu.score);
    printf("请输入学生的年龄: ");
    scanf("%d", &p->stu.age);
    printf("请输入学生的电话: ");
    scanf("%s", p->stu.phone);

    p->next = L->next;
    L->next = p;
    L->len++;
    printf("学生信息录入成功。\n");

    show_stu(L);
}

// 删除学生信息
void delstu(PNode L) {
    if (L->next == NULL) {
        printf("链表为空,无法删除。\n");
        return;
    }

    printf("请输入要删除的学生姓名: ");
    char name[50];
    scanf("%s", name);

    PNode prev = L;
    PNode curr = L->next;

    while (curr != NULL && strcmp(curr->stu.name, name) != 0) {
        prev = curr;
        curr = curr->next;
    }

    if (curr == NULL) {
        printf("未找到该学生。\n");
        return;
    }

    prev->next = curr->next;
    free(curr);
    L->len--;
    printf("学生信息删除成功。\n");

    show_stu(L);
}

// 修改学生年龄
void modstu(PNode L) {
    printf("请输入学生的分数: ");
    int score;
    scanf("%d", &score);

    PNode curr = L->next;
    int found = 0;  // 标志是否找到学生

    while (curr != NULL) {
        if (curr->stu.score == score) {
            printf("找到学生:姓名 = %s, 当前年龄 = %d\n", curr->stu.name, curr->stu.age);
            printf("请输入新的学生年龄: ");
            scanf("%d", &curr->stu.age);
            printf("学生年龄修改成功。\n");
            found = 1;
            break;
        }
        curr = curr->next;
    }

    if (!found) {
        printf("未找到分数为 %d 的学生。\n", score);
    }

    show_stu(L);  // 显示所有学生信息
}

// 查找学生
void search_name(PNode L) {
    printf("请输入要查找的学生姓名: ");
    char name[50];
    scanf("%s", name);

    PNode curr = L->next;

    while (curr != NULL && strcmp(curr->stu.name, name) != 0) {
        curr = curr->next;
    }

    if (curr != NULL) {
        printf("学生存在: 姓名 = %s, 分数 = %d, 年龄 = %d, 电话 = %s\n",
               curr->stu.name, curr->stu.score, curr->stu.age, curr->stu.phone);
    } else {
        printf("未找到该学生。\n");
    }
}

// 显示所有学生信息
void show_stu(PNode L) {
    if (L->next == NULL) {
        printf("链表为空,无学生信息。\n");
        return;
    }

    PNode curr = L->next;
    while (curr != NULL) {
        printf("姓名: %s, 分数: %d, 年龄: %d, 电话: %s\n",
               curr->stu.name, curr->stu.score, curr->stu.age, curr->stu.phone);
        curr = curr->next;
    }
}
  • create_list: 创建链表的头节点,初始化链表为空。
  • inputstu: 录入一个学生的信息并插入到链表头部,更新链表长度,并显示所有学生信息。
  • delstu: 删除指定姓名的学生信息,调整链表指针,并更新链表长度。
  • modstu: 根据学生分数修改学生的年龄,如果找到匹配的学生则更新其年龄,并显示所有学生信息。
  • search_name: 查找并显示指定姓名的学生信息。
  • show_stu: 显示链表中所有学生的信息。
主程序
c 复制代码
#include "stu.h"

int main() {
    int choice;
    PNode L = create_list();  // 创建链表

    while (1) {
        printf("----------------------------------\n");
        printf("1. 录入学生信息\n");
        printf("2. 删除学生信息\n");
        printf("3. 按姓名查找学生\n");
        printf("4. 按学生分数修改年龄\n");
        printf("5. 显示所有学生信息\n");
        printf("6. 退出\n");
        printf("----------------------------------\n");
        printf("请输入序号:\n");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                inputstu(L);
                break;
            case 2:
                delstu(L);
                break;
            case 3:
                search_name(L);
                break;
            case 4:
                modstu(L);
                break;
            case 5:
                show_stu(L);
                break;
            case 6:
                while (L != NULL) {
                    PNode temp = L;
                    L = L->next;
                    free(temp);
                }
                printf("程序退出。\n");
                return 0;
            default:
                printf("无效的选择,请重新输入。\n");
        }
    }

    return 0;
}
  • 主循环: 提供一个菜单供用户选择操作,调用对应的函数来实现不同的功能。
  • 退出: 释放链表中的所有节点,并退出程序。

简单的学生信息管理系统提供了基本的增、删、改、查和显示功能,利用链表来动态管理学生数据。

相关推荐
爱编程— 的小李32 分钟前
结构体(c语言)
c语言·开发语言
iiiiiankor3 小时前
C/C++内存管理 | new的机制 | 重载自己的operator new
java·c语言·c++
小辛学西嘎嘎3 小时前
C/C++精品项目之图床共享云存储(3):网络缓冲区类和main
c语言·开发语言·c++
韭菜盖饭3 小时前
LeetCode每日一题3261---统计满足 K 约束的子字符串数量 II
数据结构·算法·leetcode
无敌最俊朗@4 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
♡喜欢做梦4 小时前
【数据结构】ArrayList与LinkedList详解!!!——Java
java·开发语言·数据结构·链表
好心的小明4 小时前
【深圳大学】数据结构A+攻略(计软版)
数据结构
熬夜学编程的小王4 小时前
【初阶数据结构篇】插入、希尔、选择、堆排序
数据结构·c++·插入排序·选择排序·希尔排序
三小尛5 小时前
快速排序(C语言)
数据结构·算法·排序算法
椅子哥5 小时前
数据结构--排序算法
java·数据结构·算法·排序算法