当前位置: 首页 > news >正文

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

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

        链表是由一个头节点和其它申请出来的小节点连起来的,需要分开开辟空间,然后进行连接等等的操作。需要先申请节点,为了方便就封装一个申请节点的函数,然后再实现功能的时候去调用就行
        还有一个点,在后期遇到一个问题,不管我输入什么东西,打印数据的时候,我的最后一个数据不知道为什么会一直加一,后面发现是我在声明变量的时候写了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.lryc.cn/news/403954.html

相关文章:

  • STM32实战篇:按键(外部输入信号)触发中断
  • Android SurfaceView 组件介绍,挖洞原理详解
  • day2加餐 Go 接口型函数的使用场景
  • 摄像头 RN6752v1 视频采集卡
  • 记录vivado自带IP iBert眼图近端回环
  • js | Core
  • Log4J reminder
  • Unity XR Interaction Toolkit(VR、AR交互工具包)记录安装到开发的流程,以及遇到的常见问题(一)!
  • MongoDB文档整理
  • 【AI学习】关于Scaling Law的相关学习
  • 学习小记-Kafka相较于其他MQ有啥优势?
  • 技能 | postman接口测试工具安装及使用
  • 移动UI:任务中心的作用,该如何设计更合理?
  • pytorch学习(十)优化函数
  • Ubuntu22.04:安装Samba
  • Powershell 使用介绍
  • 【Langchain大语言模型开发教程】记忆
  • 最新Qt6的下载与成功安装详细介绍
  • LeetCode 热题 HOT 100 (001/100)【宇宙最简单版】
  • Ubantu 使用 docker 配置 + 远程部署 + 远程开发
  • 应用层自定义协议与序列化
  • Python学习笔记—100页Opencv详细讲解教程
  • C语言·分支和循环语句(超详细系列·全面总结)
  • Gateway源码分析:路由Route、断言Predicate、Filter
  • ARM体系结构和接口技术(十)按键中断实验①
  • PostgreSQL使用(二)——插入、更新、删除数据
  • 有关css的题目
  • 【开源库】libodb库编译及使用
  • 电力需求预测挑战赛笔记 Task3 #Datawhale AI 夏令营
  • Promise 详解(原理篇)