当前位置:网站首页>C语言:学生管理系统(链表版)
C语言:学生管理系统(链表版)
2022-08-04 01:06:00 【白的夜gxw】
这是一个小型的管理系统,使用链表进行实现,好了废话不多说,直接上代码,有需要的同学自取。运行的开发环境是vscode.
//学生管理系统(链表版)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student{
int num;//学号
char name[20];//姓名
float score;//分数
struct student *next;
}Node;
int count=0;//记录学生个数
//声明函数
Node * CreateLinkList();//创建链表
void PrintLinkList(Node *header);//打印链表
Node * InsertLinkList(Node *header);//插入链表
Node * DeleteLinkList(Node *header);//删除链表
Node * ChangeLinkList(Node *header);//更改链表
void FreeLinkList(Node *header);//释放链表
void Menu();//菜单
//创建链表
Node * CreateLinkList()
{
Node *header=NULL;
Node *prev,*pcurrent;
prev=pcurrent=(Node *)malloc(sizeof(Node));
//判断申请是否成功
if(prev==NULL){
puts("fail");
exit(-1);
}
printf("请输入第%d个学生的学号:",count+1);
scanf("%d",&pcurrent->num);
printf("请输入第%d个学生的姓名:",count+1);
scanf("%s",pcurrent->name);
printf("请输入第%d个学生的分数:",count+1);
scanf("%f",&pcurrent->score);
while(pcurrent->num)
{
count++;
if(count==1)
{
header=pcurrent;
prev=pcurrent;
}
else
{
prev->next=pcurrent;
prev=pcurrent;
}
pcurrent=(Node *)malloc(sizeof(Node));
//判断申请是否成功
if(pcurrent==NULL){
puts("fail");
exit(-1);
}
printf("请输入第%d个学生的学号:",count+1);
scanf("%d",&pcurrent->num);
printf("请输入第%d个学生的姓名:",count+1);
scanf("%s",pcurrent->name);
printf("请输入第%d个学生的分数:",count+1);
scanf("%f",&pcurrent->score);
}
prev->next=NULL;
return header;
}
//插入链表
Node * InsertLinkList(Node *header)
{
Node *pcurrent,*prev;
Node *target;
prev=pcurrent=(Node *)malloc(sizeof(Node));
//判断申请是否成功
if(prev==NULL){
puts("fail");
exit(-1);
}
target=(Node *)malloc(sizeof(Node));
//判断申请是否成功
if(target==NULL){
puts("fail");
exit(-1);
}
printf("请输入插入学生的学号:");
scanf("%d",&target->num);
printf("请输入插入学生的姓名:");
scanf("%s",target->name);
printf("请输入插入学生的分数:");
scanf("%f",&target->score);
pcurrent=header;
if(header==NULL)
{
//插入的节点就是头结点
header=target;
target->next=NULL;
}
else
{
//插入的节点是普通节点
//按照分数从小到大排序
while((pcurrent->score < target->score) && pcurrent->next)
{
prev=pcurrent;
pcurrent=pcurrent->next;
}
if(pcurrent->score > target->score)
{
if(pcurrent==header)
{
header=target;
target->next=pcurrent;
}
else
{
prev->next=target;
target->next=pcurrent;
}
}
else
{
pcurrent->next=target;
target->next=NULL;
}
}
count++;
return header;
}
//删除链表
Node * DeleteLinkList(Node *header)
{
Node *pcurrent=header,*prev;
Node *pdel=malloc(sizeof(Node));
printf("请输入删除学生的学号:");
scanf("%d",&pdel->num);
if(header==NULL)
{
printf("这是一个空链表");
return NULL;
}
else
{
while(pcurrent->num!=pdel->num && pcurrent->next)
{
prev=pcurrent;
pcurrent=pcurrent->next;
}
if(pcurrent->num==pdel->num)
{
if(pcurrent==header)
{
header=pcurrent->next;
}
else
{
prev->next=pcurrent->next;
}
}
else
{
printf("没有这个节点!");
}
}
count--;
free(pdel);
return header;
}
//更改链表
Node * ChangeLinkList(Node *header)
{
Node *pcurrent;
int tnum;
float sc;
pcurrent=(Node *)malloc(sizeof(Node));
//判断申请是否成功
if(pcurrent==NULL){
puts("fail");
exit(-1);
}
pcurrent=header;
printf("请输入需要更改的学生的序号:");
scanf("%d",&tnum);
if(header==NULL)
{
printf("NULL Linklist\n");
return NULL;
}
else
{
while(tnum!=pcurrent->num && pcurrent->next)
{
pcurrent=pcurrent->next;
}
if(tnum==pcurrent->num)
{
printf("你要更改的分数是;");
scanf("%f",&sc);
pcurrent->score=sc;
}
else
{
printf("没有找到!\n");
}
}
return header;
}
//打印链表
void PrintLinkList(Node *header)
{
Node *pcurrent=header;
if(header==NULL)
{
//空链表
printf("这是一个空链表\n");
}
else
{
printf("\n\n一共打印%d个学生的信息\n",count);
printf("============================================\n");
while(pcurrent)
{
printf("学号:%d\t姓名:%s\t分数:%.0f\n",pcurrent->num,pcurrent->name,pcurrent->score);
pcurrent=pcurrent->next;
}
printf("============================================\n");
}
}
//释放链表
void FreeLinkList(Node *header)
{
Node *pcurrent=(Node *)malloc(sizeof(Node));
//判断申请是否成功
if(pcurrent==NULL){
puts("fail");
exit(-1);
}
pcurrent=header;
while(pcurrent)
{
header=pcurrent->next;
free(pcurrent);
pcurrent=header;
}
}
void Menu()
{
printf("\t\t******************************************************\n");
printf("\t\t* 学 生 管 理 系 统 *\n");
printf("\t\t*\t1.创建学生信息 2.添加学生信息 *\n");
printf("\t\t*\t3.删除学生信息 4.更改学生信息 *\n");
printf("\t\t******************************************************\n");
}
int main()
{
Node *stu;
int num;
do
{
Menu();
printf("请输入:(按5进行退出)");
scanf("%d",&num);
switch (num)
{
case 1://创建链表
stu=CreateLinkList();
PrintLinkList(stu);
break;
case 3: //删除节点
stu=DeleteLinkList(stu);
PrintLinkList(stu);
break;
case 2: //插入节点
stu=InsertLinkList(stu);
PrintLinkList(stu);
break;
case 4://更改链表
stu=ChangeLinkList(stu);
PrintLinkList(stu);
break;
case 5://退出
break;
}
}while(num!=5);
FreeLinkList(stu);
system("pause");
return 0;
}
边栏推荐
猜你喜欢
随机推荐
Mvc, Mvp and Mvvm
互斥锁、读写锁、自旋锁,以及原子操作指令xaddl、cmpxchg的使用场景剖析
C 学生管理系统_添加学生
How to copy baby from Taobao (or Tmall store) through API interface to Pinduoduo interface code docking tutorial
typescript52-简化泛型函数调用
网络带宽监控,带宽监控工具哪个好
typescript54 - generic constraints
贴纸拼词 —— 记忆化搜索 / 状压DP
【虚拟化生态平台】虚拟化平台esxi挂载USB硬盘
MATLAB三维绘图命令plot3入门
Android interview questions and answer analysis of major factories in the first half of 2022 (continuously updated...)
GraphQL背后处理及执行过程是什么
【超详细】手把手教你搭建MongoDB集群搭建
dynamic memory two
Deng Qinglin, Alibaba Cloud Technical Expert: Best Practices for Disaster Recovery across Availability Zones and Multiple Lives in Different Locations on the Cloud
nodejs切换版本使用(不需要卸载重装)
jmeter分布式压测
.NET Static Code Weaving - Rougamo Release 1.1.0
螺旋矩阵_数组 | leecode刷题笔记
C 学生管理系统_分析