【C语言】 链表实现学生管理系统(堆区开辟空间)

news2024/9/20 10:50:18

         总体思路都能写出来,问题是感觉稍微比之前的麻烦一些,在刚开始创建结构体的时候,并没有去按照链表的思路去写,导致写成了顺序表,后面就一直纠结空间怎么开辟。

        链表是由一个头节点和其它申请出来的小节点连起来的,需要分开开辟空间,然后进行连接等等的操作。需要先申请节点,为了方便就封装一个申请节点的函数,然后再实现功能的时候去调用就行
        还有一个点,在后期遇到一个问题,不管我输入什么东西,打印数据的时候,我的最后一个数据不知道为什么会一直加一,后面发现是我在声明变量的时候写了ClassPtr Class,然后这个Class和我结构体的Class冲突了,但是很奇怪并没有报错,但是确实是这个问题导致我的代码输出时候莫名增1,不是很懂。以后定义变量的时候还是得尽量避免重复吧,反正这次重复了并没报错,也没警告,但是代码就是功能实现有问题,记录一下吧。

//link_list.h
#ifndef LINK_LIST_H
#define LINK_LIST_H
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

#define MAX 100

//学生信息
typedef struct Stu
{
    char name[20];
    int age;
    double score;
}Stu,*StuPtr;

//班级管理
typedef struct Class
{
    Stu student;
    int len;
    struct Class *next;
}Class,*ClassPtr;

//创建管理视图
void create_view();

//创建班级链表
ClassPtr link_class_create();

//申请学生信息结点
ClassPtr link_apply_node(Stu student);

//头插 插入学生信息
int link_insert_student(ClassPtr Class,Stu student);

//遍历学生信息
int link_printf_student(ClassPtr Class);

//按位置查找学生结点
ClassPtr link_search_student_pos(ClassPtr Class,int pos);

//按位置插入学生信息
int link_insert_student_pos(ClassPtr Class,int pos,Stu student);

#endif
//link_list.c
#include "link_list.h"

//创建管理视图
void create_view()
{
    printf("\t\t======1.创建班级\n");
    printf("\t\t======2.录入学生信息\n");
    printf("\t\t======3.输出所有学生信息\n");
    printf("\t\t======4.按位置插入学生信息\n");
    printf("\t\t======5.销毁班级\n");
    printf("\t\t======0.退出\n");
}

//创建班级链表
ClassPtr link_class_create()
{
    ClassPtr class_ptr = (ClassPtr)malloc(sizeof(Class));  //在堆区申请空间
    if(class_ptr == NULL)
    {
        printf("班级链表创建失败\n");
        return NULL;
    }
    class_ptr->len = 0;
    class_ptr->next = NULL;
    printf("班级创建成功\n");
    putchar(10);
    return class_ptr;
}

//申请学生信息结点
ClassPtr link_apply_node(Stu student)
{
    ClassPtr p = (ClassPtr)malloc(sizeof(Class));
    if(p == NULL)
    {
        printf("结点创建失败\n");
        return NULL;
    }
    p->student = student;
    p->next = NULL;
    return p;
}

//头插 插入学生信息
int link_insert_student(ClassPtr class_ptr,Stu student)
{
    if(class_ptr == NULL)
    {
        printf("插入失败\n");
        return -1;
    }
    ClassPtr p = link_apply_node(student);
    p->next = class_ptr->next;
    class_ptr->next = p;
    class_ptr->len++;
    printf("插入成功\n");
    return 0;
}

//遍历学生信息
int link_printf_student(ClassPtr class_ptr)
{
    if(NULL == class_ptr)
    {
        printf("遍历失败\n");
        return -1;
    }

    ClassPtr q = class_ptr->next;
    while(q)
    {
        printf("%s\t%d\t%.2lf\n",q->student.name,q->student.age,q->student.score);
        q = q->next;
    }
    putchar(10);
    return 0;
}

//按位置查找学生结点
ClassPtr link_search_student_pos(ClassPtr Class,int pos)
{
    if(NULL == Class || pos < 0 || pos > Class->len)
    {
        printf("查找失败\n");
        return NULL;
    }
    ClassPtr q = Class;
    for(int i = 0;i < pos;i++)
    {
        q = q->next;
    }
    return q;
}

//按位置插入学生信息
int link_insert_student_pos(ClassPtr class_ptr,int pos,Stu student)
{
    if(NULL == class_ptr)
    {
        printf("插入失败\n");
        return -1;
    }

    ClassPtr p = link_apply_node(student);
    ClassPtr q = link_search_student_pos(class_ptr,pos-1);

    p->next = q->next;
    q->next = p;
    class_ptr->len++;
    printf("插入成功\n");
    return 0;
}
//main.c
#include "link_list.h"
int main(int argc, char const *argv[])
{
    int n = 0,pos = 0;
    ClassPtr class_ptr;
    Stu student;
    while(1)
    {
        create_view();
        printf("请输入您需要实现的功能:");
        scanf("%d",&n);
        getchar();
        switch (n)
        {
        case 1:
            class_ptr = link_class_create();
            break;

        case 2:
            printf("请输入你需要插入的学生姓名:");
            scanf("%s",student.name);
            printf("请输入你需要插入的学生年龄:");
            scanf("%d",&student.age);
            printf("请输入你需要插入的学生成绩:");
            scanf("%lf",&student.score);
            getchar();
            link_insert_student(class_ptr,student);
            break;

        case 3:
            printf("姓名\t年龄\t成绩\n");
            link_printf_student(class_ptr);
            break;

        case 4:
            printf("请输入你需要插入第几个位置:");
            scanf("%d",&pos);
            printf("请输入你需要插入的学生姓名:");
            scanf("%s",student.name);
            printf("请输入你需要插入的学生年龄:");
            scanf("%d",&student.age);
            printf("请输入你需要插入的学生成绩:");
            scanf("%lf",&student.score);
            link_insert_student_pos(class_ptr,pos,student);
            break;

        case 0:
        goto END;
            break;

        default:
            break;
        }
    }
    END:
    return 0;
}

输出结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4学习过程记录——无法更改默认pawn类

一、概述 需要学习UE4&#xff0c;在跟着官方网站的教程中出现一些问题&#xff0c;在这里记录下来。 二、问题阐述 如图所示&#xff0c;在UE4中无法更改默认的pawn类&#xff0c;其下拉无法进行下拉。 三、问题解决 如图所示&#xff0c;需要注意&#xff0c;这个地方在游戏…

SpringMvc有几个上下文

你好&#xff0c;我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分&#xff0c;其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图&#xff0c;深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …

【人工智能】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题

文章目录 &#x1f34a;1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 &#x1f34a;2 建构AIGC伦理观&#xff1a;实现人机共创的永续提升2.1 技术手段与伦理预防2.2 即时警告与紧急关停措施2.3 法…

.NET 通过系统影子账户实现权限维持

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏&#xff0c;主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧。 02基本介绍 03编码实现 在 Windows 操作系统中&#xff0c;影子用户通常是指那些不易被普通用户或系统管理员察觉的隐藏用户账户&…

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册 前言: 什么是 MySQL? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,…

《问题002:报错-“Cannot read property ‘envId‘ of undefined“》

微信小程序云开发报错“Cannot read property ‘envId‘ of undefined“原因及解决办法 原因一&#xff1a;可能是你没有配置envId(解决步骤如下) 1、点击开发者工具上的云开发去获取/复制envId 2、找到配置文件envList.js 原因二&#xff1a;如果你已经完成意思步骤还是不行…

【人工智能】基于yolov5使用OrangePi玩转AI图片识别

前言 机缘巧合之下有幸得到了一块OrangePi AIpro边缘计算开发板&#xff0c;非常感谢香橙派官方推出的OrangePi AIpro边缘计算开发板。Orange Pi AI Pro 开发板是由香橙派和华为合作开发的高性能AI开发板&#xff0c;搭载了昇腾AI处理器&#xff0c;提供了8TOPS INT8的计算能力…

用html做python教程01

用html做python教程01 前言开肝构思实操额外修饰更换字体自适应 最后 前言 今天打开csdn的时候&#xff0c;看见csdn给我推荐了一个python技能书。 说实话&#xff0c;做得真不错。再看看我自己&#xff0c;有亿点差距&#x1f61f;。 开肝 先创建一个文件&#xff0c;后缀…

【大数据面试题】37 Doris 是怎么保证性能的?

一步一个脚印&#xff0c;一天一道大数据面试题 博主希望能够得到大家的点赞收藏支持&#xff01;非常感谢 点赞&#xff0c;收藏是情分&#xff0c;不点是本分。祝你身体健康&#xff0c;事事顺心&#xff01; Doris 是当下大热的 MPP 数据库&#xff0c;下面来聊聊它如何保证…

力扣每日一题1186. 删除一次得到子数组最大和【动态规划】

本题的核心在于对于每个元素&#xff0c;我们分别考虑保留和删除两种状态&#xff0c;并根据前面的状态转移来更新当前状态。最后&#xff0c;遍历所有元素&#xff0c;找到最大和即可。 状态定义 dp[i][0] 表示以第 i 个元素结尾且未删除元素的子数组的最大和。dp[i][1] 表示…

ClamAV:Linux病毒查杀软件安装使用

简介&#xff1a;ClamAV是一个开源防病毒工具包&#xff0c;专为邮件网关上的电子邮件扫描而设计。它提供了许多实用程序&#xff0c;包括一个灵活且可扩展的多线程守护进程、一个命令行扫描程序和用于自动数据库更新的高级工具。该软件包的核心是以共享库的形式提供的防病毒引…

大豆叶部病害soybean-目标检测数据集(包括VOC格式、YOLO格式)

大豆叶部病害soybean-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1DIq2vp-z_fM7Xj_nsBAGBQ?pwdk373 提取码&#xff1a;k373 数据集信息介绍&#xff1a; 共有 1232 张图像和一一对应的标注…

python 打包

#导出依赖文件列表 pip freeze > requirements.txt #安装对应文件 pip install -r requirements.txt #将依赖打成对应whl文件 pip wheel --wheel-dir ./dist -r ./requirements.txt #安装whl文件 pip install …whl

消费金融系统开发回忆录

架构设计图 整个支付链路上的功能 支付系统应该有&#xff1a;账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单&#xff0c;在支付系统侧就是要记录清楚&#xff0c;谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…

【Linux知识点汇总】07 Linux系统防火墙相关命令,关闭和开启防火墙、开放端口号

​完整系列文章目录 【Linux知识点汇总】 心血来潮突然想起之前写过的系列文章【Linux知识点汇总】还未完结&#xff0c;那么今天就继续吧 说明&#xff1a;这个系列的内容&#xff0c;在系列【Linux服务器Java环境搭建】中会经常用到&#xff0c;大家可以自行查找相关命令 一、…

SMU Summer 2024 div2 2nd

文章目录 The Second Week一、前言二、算法1.二分图匹配/匈牙利算法<1>&#xff08;[ZJOI2007]矩阵游戏&#xff09;<2>&#xff08;有大家喜欢的零食吗&#xff09; 2.优先队列<1>&#xff08;Running Median&#xff09;<2>&#xff08;旅途的终点&a…

运维团队如何高效监控容器化环境中的PID及其他关键指标

随着云计算和容器化技术的快速发展&#xff0c;越来越多的企业开始采用容器化技术来部署和管理应用程序。然而&#xff0c;容器化环境的复杂性和动态性给运维团队带来了前所未有的挑战。本文将从PID&#xff08;进程标识符&#xff09;监控入手&#xff0c;探讨运维团队如何高效…

下载最新版Anaconda、安装、更换源、配置虚拟环境并在vscode中使用

文章目录 进入官网进入下载页安装更换源配置虚拟环境env安装包requests在vscode中使用虚拟环境 进入官网 https://repo.anaconda.com/ 或进入清华大学下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 进入下载页 安装 更换源 查看已经存在的镜像源 bash cond…

windows实现端口转发

最近在做界面开发时&#xff0c;想要直接在手机上看看实际效果&#xff0c;由于我的服务器是放在虚拟机上的&#xff0c;所以需要在window上面做个端口转发&#xff0c;这就需要用到netsh命令。 添加端口转发 netsh interface portproxy add v4tov4 listenport8080 listenadd…

广州机房搬迁网络部署方案

新机房网络部署应包括核心模块、业务模块、光传输模块、安全模块、流量采集模块、路由模块、带外管理模块等&#xff0c;每个模块都根据业务需求规划成多个POD&#xff08;Point Of Delivery&#xff0c;基本物理设计单元&#xff09;。 核心模块部署主要实现各业务模块的高速互…