#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//////////////////////////////////////////////////////////////////////////
struct _STUINFO
{
char iID[20];
char sName[50];
int iScore[3];
int iAvg;
};
#define DATATYPE _STUINFO
typedef struct _NODE
{
DATATYPE _data;
struct _NODE *pNext;
}_SLNODE;
char* pOutInfo[]=
{
"欢迎使用学生成绩管理系统 v1.0\n",
"请选择您的操作:\n【1】输入新记录\n【2】显示记录\n【3】查找\n【4】排序输出\n【5】插入新记录\n【6】删除记录\n【7】保存文件\n【0】退出系统\n",
"您输入的功能有误,请查询后再输入!\n",
"请输入 学号,姓名,分数1,分数2,分数3:\n",
"操作完成!请继续使用!\n"
};
//////////////////////////////////////////////////////////////////////////
void SL_init(_SLNODE** head);
void SL_getItem(_SLNODE* head,int i,DATATYPE* data);
int SL_getLength(_SLNODE* head);
void SL_insert(_SLNODE* head,int i,DATATYPE data);
void SL_delete(_SLNODE* head,int i,DATATYPE* data);
void SL_destroy(_SLNODE** head);
void InputRecord();
void DisPlay(_STUINFO stuInfo);
void LookAllRecord();
void FindRecord();
void InsertRecord();
void DeleteRecord();
void SortDisplay();
void SaveRecord();
//////////////////////////////////////////////////////////////////////////
//global define
_SLNODE* head;
char* sFilePath="c:\\score.dat";
//////////////////////////////////////////////////////////////////////////
void main()
{
int iOpCode=-1;
printf(pOutInfo[0]);
printf(pOutInfo[1]);
SL_init(&head);
do
{
scanf("%d",&iOpCode);
switch(iOpCode)
{
case 1:
InputRecord();
break;
case 2:
LookAllRecord();
break;
case 3:
FindRecord();
break;
case 4:
SortDisplay();
break;
case 5:
InsertRecord();
break;
case 6:
DeleteRecord();
break;
case 7:
SaveRecord();
break;
default:
printf(pOutInfo[2]);
printf(pOutInfo[1]);
break;
}
printf(pOutInfo[4]);
printf(pOutInfo[1]);
} while(iOpCode!=0);
SL_destroy(&head);
}
void DisPlay(_STUINFO stuInfo)
{
printf("学号:%s ",stuInfo.iID);
printf("姓名:%s ",stuInfo.sName);
printf("成绩1:%d ",stuInfo.iScore[0]);
printf("成绩2:%d ",stuInfo.iScore[1]);
printf("成绩3:%d ",stuInfo.iScore[2]);
printf("平均成绩:%d ",stuInfo.iAvg);
}
void InputRecord()
{
printf("输入一条新记录:\n");
_STUINFO stuInfo;
printf(pOutInfo[3]);
scanf("%s %s %d %d %d",&stuInfo.iID,&stuInfo.sName,&stuInfo.iScore[0],&stuInfo.iScore[1],&stuInfo.iScore[2]);
stuInfo.iAvg=(stuInfo.iScore[0]+stuInfo.iScore[1]+stuInfo.iScore[2])/3;
printf("%d",stuInfo.iAvg);
SL_insert(head,SL_getLength(head),stuInfo);
}
void LookAllRecord()
{
int iTal=0;
iTal=SL_getLength(head);
for (int i=0;i<iTal;i++)
{
_STUINFO stu;
SL_getItem(head,i,&stu);
printf("当前第%d条记录内容[共%d条记录]:\n",i,SL_getLength(head));
DisPlay(stu);
printf("\n");
}
}
void FindRecord()
{
printf("请输入您要查找的学生姓名:\n");
bool bFind=false;
char sName[50];
scanf("%s",&sName);
for (int i=0;i<SL_getLength(head);i++)
{
_STUINFO stuInfo;
SL_getItem(head,i,&stuInfo);
if (!strcmp(sName,stuInfo.sName))
{
DisPlay(stuInfo);
bFind=true;
printf("\n");
break;
}
}
if (!bFind)
{
printf("您查找的数据不存在!\n");
}
}
void InsertRecord()
{
_STUINFO stuInfo;
int iPos=0;
printf("请输入您要插入数据的位置[当前记录数:%d]:\n",SL_getLength(head));
scanf("%d",&iPos);
if (iPos<0 || iPos>SL_getLength(head))
{
printf("位置错误,插入失败!");
return;
}
printf(pOutInfo[3]);
scanf("%s %s %d %d %d",&stuInfo.iID,&stuInfo.sName,&stuInfo.iScore[0],&stuInfo.iScore[1],&stuInfo.iScore[2]);
stuInfo.iAvg=(float)((stuInfo.iScore[0]+stuInfo.iScore[1]+stuInfo.iScore[2])/3.0);
SL_insert(head,iPos,stuInfo);
}
void DeleteRecord()
{
int iPos=0;
_STUINFO stuInfo;
printf("请输入您要删除记录的位置[当前共有%d条记录]\n",SL_getLength(head));
scanf("%d",&iPos);
if (iPos<0 || iPos>SL_getLength(head))
{
return;
}
SL_delete(head,iPos,&stuInfo);
printf("您删除的数据记录是:\n");
DisPlay(stuInfo);
printf("\n");
}
void SortDisplay()
{
_SLNODE *sort;
_STUINFO stuInfo,stuTemInfo,stuInfo1,stuInfo2,stuRslt;
SL_init(&sort);
for (int i=0;i<SL_getLength(head);i++)
{
SL_getItem(head,i,&stuInfo);
SL_insert(sort,i,stuInfo);
}
for (int m=0;m<SL_getLength(sort);m++)
{
SL_getItem(sort,m,&stuInfo1);
for (int n=m;n<SL_getLength(sort);n++)
{
SL_getItem(sort,n,&stuInfo2);
if (stuInfo1.iAvg>stuInfo2.iAvg)
{
stuTemInfo=stuInfo1;
stuInfo1=stuInfo2;
stuInfo2=stuTemInfo;
SL_delete(sort,m,&stuRslt);
SL_insert(sort,m,stuInfo1);
SL_delete(sort,n,&stuRslt);
SL_insert(sort,n,stuInfo2);
}
}
}
for (int x=0;x<SL_getLength(sort);x++)
{
SL_getItem(sort,x,&stuRslt);
DisPlay(stuRslt);
printf("\n");
}
SL_destroy(&sort);
}
void SaveRecord()
{
printf("文件保存的默认路径为%s\n",sFilePath);
FILE *f;
_STUINFO stuInfo;
f=fopen(sFilePath,"wt");
for (int i=0;i<SL_getLength(head);i++)
{
SL_getItem(head,i,&stuInfo);
fwrite(stuInfo.iID,1,20,f);
fwrite(stuInfo.sName,1,50,f);
fwrite(&stuInfo.iScore[0],1,sizeof(int),f);
fwrite(&stuInfo.iScore[1],1,sizeof(int),f);
fwrite(&stuInfo.iScore[2],1,sizeof(int),f);
fwrite(&stuInfo.iAvg,1,sizeof(int),f);
}
fclose(f);
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//动态链表
void SL_init(_SLNODE** head)
{
if ((*head=(_SLNODE*)malloc(sizeof(_SLNODE)))==NULL)
{
exit(0);
}
(*head)->pNext=NULL;
}
int SL_getLength(_SLNODE* head)
{
_SLNODE *p=head;
int iSize=0;
while (p->pNext!=NULL)
{
p=p->pNext;
iSize++;
}
return iSize;
}
void SL_insert(_SLNODE* head,int i,DATATYPE data)
{
_SLNODE *p,*q;
int j;
p=head;
j=-1;
while (p->pNext!=NULL && j<i-1)
{
p=p->pNext;
j++;
}
if (j!=i-1)
{
printf("链表出错!\n");
return;
}
if ((q=(_SLNODE*)malloc(sizeof(_SLNODE)))==NULL)
{
exit(0);
}
q->_data=data;
q->pNext=p->pNext;
p->pNext=q;
}
void SL_delete(_SLNODE* head,int i,DATATYPE* data)
{
_SLNODE *p,*s;
int j;
p=head;
j=-1;
while (p->pNext!=NULL && p->pNext->pNext!=NULL && j<i-1)
{
p=p->pNext;
j++;
}
if (j!=i-1)
{
printf("链表出错!\n");
return;
}
s=p->pNext;
*data=s->_data;
p->pNext=p->pNext->pNext;
}
void SL_getItem(_SLNODE* head,int i,DATATYPE* data)
{
_SLNODE *p;
int j;
p=head;
j=-1;
while (p->pNext!=NULL && j<i)
{
p=p->pNext;
j++;
}
if (j!=i)
{
printf("链表错误!\n");
return;
}
*data=p->_data;
}
void SL_destroy(_SLNODE** head)
{
_SLNODE *p,*q;
p=*head;
while (p!=NULL)
{
q=p;
p=p->pNext;
free(q);
}
*head=NULL;
}

刘良运
- 粉丝: 81
- 资源: 1万+
最新资源
- 双馈风机风电场串补并网次同步振荡谐振仿真模型:Matlab仿真实现与参考文献解读,双馈风机风电场串补并网次同步振荡谐振仿真模型:基于DFIG-SSO SSR的Simulink仿真研究(附文献),双馈风
- 数据库大作业-一个电商平台.zip
- 基于微信小程序的培训老师预约课程管理设计源码
- 毕业设计,移动APP+PC后台(weex+vue).zip
- 储能参与调峰调频联合调度模型研究:考虑电池退化成本与充放电约束的优化模型(附Matlab代码),储能参与调峰调频联合调度模型研究:考虑电池退化成本与充放电约束的优化模型(Matlab实现),储能参与调
- AI领域DeepSeek-R1对话模型的创新使用方法与实用技巧
- 基于SSM框架与物品的协同过滤算法(ItemCF)的简单电子书推荐系统.zip
- 基于Python和Shell的轻量级信贷风控引擎设计源码
- Matlab Simulink下的电池仿真模型搭建:从单体电池到电池包均衡管理,Matlab Simulink电池仿真模型搭建:从单体电池到电池包均衡管理,Matlab simulink仿真模型搭建(
- 基于Matlab GUI界面的模糊车牌图像复原系统-集成维纳滤波、最小二乘法、L-R循环边界等多种算法,基于Matlab GUI界面的车牌图像模糊复原系统研究:探索维纳滤波、最小二乘法滤波、L-R循
- 基于微信小程序和Vue的线上问诊小程序管理系统设计源码
- DeepSeek小白使用指南,99% 的人都不知道的使用技巧(建议收藏)docx.docx
- 1000个DeepSeek神级提示词,让你轻松驾驭AI.docx
- 三相并网逆变器双闭环控制策略:电网电流外环与电容电流内环协同调节,实现单位功率因数及有源阻尼的Simulink仿真研究,三相并网逆变器双闭环控制策略:电网电流外环与电容电流内环协同调节,实现单位功率因
- 基于Vue框架的记账软件设计源码
- 脉振高频电压注入技术在PMSM无速度传感器控制系统中的应用,脉振高频电压注入永磁同步电机无传感器技术揭秘,脉振高频电压注入的永磁同步电机无速度传感器 PMSM ,PMSM; 脉振高频电压注入; 无速
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


