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

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

相关推荐
程序员清风10 分钟前
哈希表:从键值映射到高效查找
数据结构·哈希算法·散列表
万年咸鱼27 分钟前
解决C语言的内存释放机制
java·c语言·python
老王爱玩车2 小时前
自定义类型:结构体
c语言·开发语言·学习
Logic1013 小时前
C语言/数据结构字符串题解:最短循环节——找出能重复构成原串的最短基础子串
c语言·数据结构·字符串·枚举·时间复杂度·算法题·kmp优化
我就是不信4 小时前
CuTest:轻量级 C 语言单元测试框架实战指南
c语言·单元测试·log4j
垆边人似月.4 小时前
城市连通性(200分 / 并查集)
数据结构·算法·图论
Gust of wind4 小时前
串与KMP模式匹配:存储结构、基本操作、next数组手算
c语言·数据结构·后端·算法
Navigator_Z4 小时前
LeetCode //C - 1283. Find the Smallest Divisor Given a Threshold
c语言·算法·leetcode
by209995 小时前
list:迭代器与资源管理实现的综合叙述(下)
数据结构·c++·笔记·list
我不会起名字3225 小时前
二叉树的遍历与二叉搜索树:把递归、迭代、还原树一次讲透
数据结构·leetcode·二叉树·二叉搜索树