首页 > 其他分享 >链表实现学生管理系统

链表实现学生管理系统

时间:2025-01-21 21:28:39浏览次数:3  
标签:STD SDList temp 管理系统 ptr 学生 链表 printf id

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>
//案例需求:使用双向 带头 循环链表实现学生信息系统的增删改查

//定义学生信息结构体类型
typedef struct student {
    int id;//学号
    char uname[20];//姓名
    char sex[5];//性别
    double score;//成绩
}st;

typedef struct student_dlink {
    struct student_dlink* pre;//指向上一个节点指针
    st s;//存储节点
    struct student_dlink* next;//指向下一个节点指针
}STD;

void print_menu(void);
STD* create_node();
STD* init_List();
void head_insert(STD* SDList);
void print_list(STD* SDList);
STD* find_list(STD* SDList, int id);
void delete_list(STD* SDList, int id);
void change_list(STD* SDList, int id);
void destory(STD** SDList);
int main() {
    print_menu();
    int order = 0;
    STD* SDList = NULL;//学生链表的哨兵位
    int id = 0;//学生的id


    while (1) {
        printf("请输入您的操作指令:");
        scanf("%d", &order);
        switch (order) {
            case 1:
                //初始化  一个空的双链表(只有一个哨兵位)
                SDList = init_List();
                break;
            case 2:
                //打印
                print_list(SDList);
                break;
            case 3:
                //追加
                head_insert(SDList);
                break;
            case 4:
                //删除   根据id删除
                printf("请输入要删除学生的id:");
                scanf("%d", &id);
                delete_list(SDList, id);
                break;
            case 5:
                //修改
                printf("请输入要修改学生的id:");
                scanf("%d", &id);
                change_list(SDList, id);
                break;
            case 6:
                //查询
                //思路:根据id查询  查到了返回该学生的地址,根据地址输出信息;查不到返回NULL
                printf("请输入要查询学生的id:");
                scanf("%d", &id);
                STD* ptr = find_list(SDList, id);
                if (!ptr) {
                    printf("查无此人\n");
                }
                else {
                    printf("%d  %s  %s  %.2lf\n", ptr->s.id, ptr->s.uname, ptr->s.sex, ptr->s.score);
                }
                break;
            case 7:
                //销毁
                destory(&SDList);
                break;
            case 8:
                //退出
                return;
            default:
                printf("指令输入有误,请重新输入");
                //break;
        }
    }

    return 0;

}

//打印菜单
void print_menu(void) {
    printf("    欢迎使用学生成绩管理系统\n");
    printf("* =============================== *\n");
    printf("操作指令说明:\n");
    printf("* 1.初始化                        *\n");
    printf("* 2.打印                          *\n");
    printf("* 3.追加                          *\n");
    printf("* 4.删除                          *\n");
    printf("* 5.修改                          *\n");
    printf("* 6.查询                          *\n");
    printf("* 7.销毁                          *\n");
    printf("* 8.退出系统                      *\n");
    printf("* =============================== *\n");
}

//辅助函数,创建新节点
STD* create_node() {
    STD* newnode = (STD*)malloc(sizeof(STD));
    if (newnode == NULL) {
        printf("内存申请失败,无法创建新节点\n");
        return NULL;
    }
    //内存清0
    memset(newnode, 0, sizeof(STD));
    return newnode;
}

//初始化
STD* init_List() {
    //创建新节点
    STD* newnode = create_node();
    //给新节点赋值
    newnode->pre = newnode;
    newnode->next = newnode;
    printf("初始化成功\n");
    return newnode;
}

//追加            
void head_insert(STD* SDList) {
    st stu;//定义结构体变量 存储学生信息
    printf("请输入追加学生的学号  姓名   性别   成绩:");
    scanf("%d %s %s %lf", &stu.id, stu.uname, stu.sex, &stu.score);
    //printf("%d %s %s %.2lf",s.id, s.uname, s.sex, s. score)
    //创建新节点
    STD* newnode = create_node();
    newnode->s = stu;
    //考虑到追加前链表是否存在元素节点
    newnode->pre = SDList->pre;
    SDList->pre->next = newnode;
    newnode->next = SDList;
    SDList->pre = newnode;
    printf("追加成功\n");
}


//打印
void print_list(STD* SDList) {
    assert(SDList);
    if (SDList->next == SDList) {
        printf("空表无法打印\n");
        return;
    }
    //遍历
    STD* temp = SDList->next;
    printf("学号  姓名   性别   成绩\n");
    while (temp != SDList) {
        printf("%d  %s  %s  %.2lf\n", temp->s.id, temp->s.uname, temp->s.sex, temp->s.score);
        temp = temp->next;
    }
}

//查询
STD* find_list(STD* SDList, int id) {
    assert(SDList);
    STD* temp = SDList->next;
    while (temp != SDList) {
        if (temp->s.id == id) {
            return temp;
        }
        temp = temp->next;
    }
    return NULL;
}

//删除
void delete_list(STD* SDList, int id) {
    //查询是否有此人
    STD* ptr = find_list(SDList, id);
    if (!ptr) {
        printf("您要删除的学生不存在\n");
        return;
    }
    ptr->pre->next = ptr->next;
    ptr->next->pre = ptr->pre;
    free(ptr);
    printf("删除成功\n");
}

//修改
void change_list(STD* SDList, int id) {
    //查询是否有此人
    STD* ptr = find_list(SDList, id);
    if (!ptr) {
        printf("您要修改的学生不存在\n");
        return;
    }
    //修改
    printf("请输入修改后的新学生的学号  姓名   性别   成绩:\n");
    scanf("%d  %s  %s  %lf", &(ptr->s.id), &(ptr->s.uname), &(ptr->s.sex), &(ptr->s.score));
    printf("修改成功\n");
}

//销毁
void destory(STD** SDList) {
    assert(SDList);
    //遍历后,一个一个释放
    STD* temp = (*SDList)->next;//保存第一个元素节点
    while (temp != *SDList) {
        STD* ptr = temp->next;//先保存下一个元素
        free(temp);
        temp = ptr;
    }
    free(*SDList);//释放哨兵位
    *SDList = NULL;
    printf("销毁成功\n");
}

标签:STD,SDList,temp,管理系统,ptr,学生,链表,printf,id
From: https://blog.csdn.net/m0_68557555/article/details/145213258

相关文章

  • 基于SpringBoot+Vue开发的宠物管理系统的设计与实现
    文章目录内容涵盖详细视频演示系统演示截图技术框架前端框架Vue系统测试系统测试的目的系统功能测试代码参考为什么选择我?获取源码内容涵盖详细视频演示文章底部名片,联系我获取更详细的演示视频系统演示截图技术框架后端框架支持:Java(SpringBoot)、Python......
  • 基于SpringBoot的大学生创新能力培养平台设计与实现
    文章目录内容涵盖详细视频演示系统演示截图技术框架前端框架Vue系统测试系统测试的目的系统功能测试代码参考为什么选择我?获取源码内容涵盖详细视频演示文章底部名片,联系我获取更详细的演示视频系统演示截图技术框架后端框架支持:Java(SpringBoot)、Python、P......
  • node.js基于木材加工与包装的物资管理系统程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景关于物资管理系统的研究,现有研究主要以通用物资管理模式为主,专门针对木材加工与包装行业物资管理的研究较少。在国外,物资管理系统发展相对成熟,注重利用先进......
  • 计算机毕业设计ssmssm校园慈善捐款系统 基于SSM框架的校园公益捐赠平台开发 SSM技术栈
    计算机毕业设计ssmssm校园慈善捐款系统66i7l2q6(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享在当今社会,慈善事业的重要性日益凸显,尤其是在校园环境中,培养学生的公益意识和社会责任感显得尤为重要。传统的慈善捐赠方式存在诸多不......
  • 计算机毕业设计ssmWeb基于SSM租车管理系统 基于SSM框架的在线租车平台开发 SSM技术栈
    计算机毕业设计ssmWeb基于SSM租车管理系统ja4f2g09(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享在现代社会,租车服务已经成为人们出行的重要选择之一。无论是商务出行、旅游观光还是个人临时需求,租车都提供了一种灵活、便捷的交通......
  • 计算机毕业设计Springboot线上报名系统设计与实现 基于Spring Boot的在线活动报名系统
    计算机毕业设计Springboot线上报名系统设计与实现8aa4689w(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着互联网技术的飞速发展,传统的线下报名方式已经无法满足现代社会对高效、便捷和安全的需求。线上报名系统应运而生,它不仅......
  • 小学生学编程
        今天来一次霍霍电脑了啊,功能很强大,在点击是不能用回车,自动禁用任务管理器。记得以管理员程序运行哦!importjavax.swing.JOptionPane;importjava.awt.*;importjava.awt.event.AWTEventListener;importjava.awt.event.KeyEvent;importjava.io.IOException;......
  • 【开源】基于SSM框架奶茶店管理系统(计算机毕业设计)+万字毕业论文+远程部署+ppt+代码讲
    系统合集跳转源码获取链接点击主页更能获取海量源码博主联系方式拉到下方点击名片获取!!!博主联系方式拉到下方点击名片获取!!!10年计算机开发经验,主营业务:源码获取、项目二开、语音辅导、远程调试、毕业设计、课程设计、毕业论文、BUG修改一、系统环境运行环境:最好是......
  • springboot毕设 基于SpringBoot技术的招聘管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今竞争激烈的商业环境中,企业的人力资源管理显得尤为重要。随着信息技术的飞速发展和互联网的普及,传统的手工招聘流程已难以满足现代企业高效、便......
  • springboot毕设 基于springboot的音乐网站管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和普及,数字化音乐已成为现代人生活中不可或缺的一部分。音乐网站作为数字音乐传播的主要平台,不仅承载着庞大的音乐资源,还扮......