#include <iostream>
#include <string>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef struct LNode{ //单链表的存储结构
string no;
string name;
int jyz; //结点的数据域
struct LNode *next; //结点的指针域
}LNode,*Linklist; //Linklist为指向结构体LNode的指针类型
Status Initlist_L(Linklist &L)//构造一个空的单链表L
{
L=new LNode;
L->next=NULL;
return OK;
}
//导入文件建学生经验值表
//后插法创建单链表
void Createlist_L(Linklist &L,int n)
{ LNode *p,*r;
L=new LNode;
L->next=NULL;
r=L;//尾指针指向头结点
cout<<"请输入学生的学号、姓名、经验值:\n";
for(int i=0;i<n;i++)
{
p=new LNode;
cin>>p->no;
cin>>p->name;
cin>>p->jyz;
cout<<endl;
p->next=NULL;//插入到表尾
r->next=p;
r=p;//r指向新的尾结点
}
}
//插入学生
void Linkinsert_L(Linklist &L,string no1,string name1,int c)
{ LNode *p,*s;
p=L;
while(p)
{ if(!(p->next))
break;
else
p=p->next;
}
s=new LNode;
s->no=no1;
s->name=name1;
s->jyz=c;
s->next=NULL;
p->next=s;
cout<<"插入成功!\n";
}
//删除学生
void Listdelete_L(Linklist &L,int d,string key)
{ int flag=0;
LNode *p,*q=new LNode;//在这里不能只写LNode *p;
//因为后面delete p;(当p不存在时会出错)
//因为p还没有分配空间
p=L;
switch(d)
{
case 1:
{ //按学号查找
while(p)
{
if(p->next)
{ if(p->next->no==key)
{
q=p->next;
p->next=q->next;
flag=1;
break;
}
}
p=p->next;
}
string s;
s=flag==1?"成功删除"+q->name+"的所有信息!":"没有找到学号为"+key+"的学生的信息!";
cout<<s<<endl;
delete q;
break;
}
case 2://按姓名查找
{
while(p)
{
if(p->next)
{
if(p->next->name==key)
{
q=p->next;
p->next=q->next;
flag=1;
break;
}
}
p=p->next;
}
string s;
s=flag==1?"成功删除"+q->name+"的所有信息!":"没有找到"+key+"的信息!";
cout<<s<<endl;
delete q;
break;
}
default:
break;
}
}
//显示全部学生的信息
void presentstudent(Linklist L)
{
LNode *p;
p=L->next;
int num=0;
cout<<"学号"<<"姓名"<<"经验值"<<endl;
while(p)
{
cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl;
p=p->next;num++;
}
cout<<"已显示出所有学生的信息,总共有"<<num<<"个学生!"<<endl;
}
//为某学号学生加指定经验值
void Jiajyz(Linklist &L, string no1,int jyz2)
{
LNode *p;
p=L->next;
while(p&&p->no!=no1)
{
p=p->next;
}
if(!p)
{
cout<<"该学号不存在!\n";
}
else
{ p->jyz=p->jyz+jyz2;
cout<<"成功为"<<p->no<<"同学增加经验值"<<jyz2<<endl;
cout<<"现该学生的信息如下:\n";
cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl;
}
}
//为某学号学生减指定经验值
void Jianjyz(Linklist &L, string no2,int jyz2)
{
LNode *p;
p=L->next;
while(p&&p->no!=no2)
{
p=p->next;
}
if(!p)
{
cout<<"该学号不存在!\n";
}
else{
p->jyz=p->jyz-jyz2;
cout<<"成功为"<<p->no<<"同学减去经验值"<<jyz2<<endl;
cout<<"该学生的信息如下:\n";
cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl;
}
}
// 按姓名查找学生经验值
LNode *Locatename_L(Linklist L,string name1)
{ LNode *p;
p=L->next;
while(p&&p->name!=name1)
p=p->next;
if(!p)
{
cout<<"该学生不存在!"<<endl;
}
else{
cout<<"该学生的经验值如下:\n";
cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl;
}
}
//求经验值最高的学生信息
void GetHighest(Linklist L)
{
LNode *Biger=new LNode;//最大的那个数
LNode *B=new LNode;
LNode *p=new LNode;
p=L->next;
Biger->jyz=p->jyz;
Biger->name=p->name;
Biger->no=p->no;
Biger->next=NULL;
while(p)//寻找最高的经验值
{
if(p->next)
{
p=p->next;
if(p->jyz>Biger->jyz)
{
Biger->jyz=p->jyz;
Biger->name=p->name;
Biger->no=p->no;
Biger->next=NULL;
}
}
else
break;
}
p=L->next;
B=Biger;
while(p)//最高经验值不止一个学生的时候
{
if(p->jyz==Biger->jyz)
{
LNode *t=new LNode;
t->jyz=p->jyz;
t->name=p->name;
t->no=p->no;
t->next=NULL;
B->next=t;
B=B->next;
}
p=p->next;
}
Biger=Biger->next;
while(Biger)
{
cout<<"学号 "<<"姓名 "<<"经验值"<<endl;
cout<<Biger->no<<" "<<Biger->name<<" "<<Biger->jyz<<" "<<endl;
Biger=Biger->next;
}
}
int main()
{ int choose,n1,jyz2,mode;
string no2,name2,key1;
LNode *p,*la;
cout<<" ***************************************"<<endl;
cout<<"* 1-------建立学生经验值表 *"<<endl;
cout<<"* 2-------输入所有学生的信息 *"<<endl;
cout<<"* 3-------插入学生 *"<<endl;
cout<<"* 4-------删除学生 *"<<endl;
cout<<"* 5-------显示全部学生信息 *"<<endl;
cout<<"* 6-------为某学号学生加指定经验值 * "<<endl;
cout<<"* 7-------为某学号学生减指定经验值 *"<<endl;
cout<<"* 8-------按姓名查找学生经验值 *"<<endl;
cout<<"* 9-------求经验值最高的学生信息 *"<<endl;
cout<<"* 0-------存盘并退出 *"<<endl;
cout<<"***************************************"<<endl;
choose=-1;
while(choose!=0)
{
cout<<"请选择:";
cin>>choose;
switch(choose)
{
case 1:
if(Initlist_L(la))
cout<<"成功建立学生经验值表!\n\n";
break;
case 2:
cout<<"请输入要学生的个数:";
cin>>n1;
Createlist_L(la,n1);
cout<<"成功学生经验值表!"<<endl<<endl;
break;
case 3:
cout<<"请分别输入要插入的学生的学号、姓名、经验值\n";
cin>>no2>>name2>>jyz2;
Linkinsert_L(la,no2,name2,jyz2);
break;
case 4:
{ string Key1;
cout<<"请选择删除方式:"<<endl;
cout<<"1:按学号删除"<<endl;
cout<<"2:按姓名删除"<<endl;
cout<<"请选择1或2"<<endl;
cin>>mode;
if(mode==1||mode==2)
{
string s=mode==1?"请输入要删除学生的学号!":"请输入要删除学生的姓名!";
cout<<s<<endl;
cin>>key1;
Listdelete_L(la,mode,key1);
}
else
{
cout<<"请输入合法数字!"<<endl;
}
break;
}
case 5:
{
presentstudent(la);
break;
}
case 6:
{ cout<<"请输入学生的学号:";
cin>>no2;
cout<<"请输入要增加的经验值:";
cin>>jyz2;
Jiajyz(la,no2,jyz2);
break;
}
case 7:
{ cout<<"请输入学生的学号:";
cin>>no2;
cout<<"请输入要减少的经验值:";
cin>>jyz2;
Jianjyz(la,no2,jyz2);
break;
}
case 8:
{
cout<<"请输入要查找的学生:";
cin>>name2;
Locatename_L(la,name2);
break;
}
case 9:
{
GetHighest(la);
break;
}
default:
break;
}
}
return 0;
}
学生课堂经验值管理系统
最新推荐文章于 2021-01-05 23:26:57 发布