#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int ElemType;
typedef char ZF;
struct LNode
{
ZF name[20];//名字
ElemType num;//学号
ElemType data;//成绩
struct LNode *next;//指针域
};
typedef struct LNode LNode;
typedef struct LNode* LinkList;
//初始化
Status InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
//插入
Status ListInsert(LinkList &L,int i,ElemType xh,ZF xm[20],ElemType cj)// 学号 姓名 成绩
{
if(i<1) return ERROR;
LNode *p=L;
int j=0;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL) return ERROR;
LNode *s=new LNode;
s->num=xh;
//s->name[20]=xm[20];格式错误
strcpy(s->name,xm);//C++赋值给字符串的格式
s->data=cj;
s->next=p->next;
p->next=s;
return OK;
}
Status ZJ(LinkList &L,int n)//增加信息
{
int i;
ElemType xh,cj;
ZF xm[20];
for(i=0;i<n;i++)
{
cout<<endl;
cout<<"学号:";
cin>>xh;
cout<<"姓名:";
cin>>xm;
cout<<"成绩:";
cin>>cj;
ListInsert(L,i+1,xh,xm,cj);//插入
}
return OK;
}
//学生个数(链表长度)
Status GetLenght(LinkList L)
{
int l;
LNode *p=L->next;
for(l=0;p!=NULL;l++)
{
p=p->next;
}
return l;
}
//按学号查找成绩
Status XhGetScore(LinkList L,ElemType xh,ElemType &cj)
{
int i,l;
l=GetLenght(L);
LNode *p=L->next;
cj=-1;
for(i=0;i<l;i++)
{
if(xh==p->num)
{
cj=p->data;
//cout<<p->data<<endl;
//return cj;
}
else p=p->next;
}
//没有这个学号
if(p==NULL&&cj==-1)//if(i==l-1&&xh!=p->data)
{
cout<<"学号输入有误,请重新输入"<<endl;
return ERROR;
}
else return cj;
}
//按学号删除
Status XhDelete(LinkList &L,ElemType xh)
{
int i,l;
l=GetLenght(L);
LNode *p=L;
LNode *s;
for(i=0;i<=l;i++)
{
if(xh==p->next->data)
{
s=p->next;
p->next=s->next;
delete s;
return OK;
}
p=p->next;
}
if(p->next==NULL)
{
cout<<"学号输入有误,请重新输入"<<endl;
return ERROR;
}
}
//按成绩删除
Status ScoreDelete(LinkList &L,ElemType cj)
{
int i,l;
l=GetLenght(L);
LNode *p=L;
LNode *s;
for(i=0;i<=l;i++)
{
if(p->next->data==cj)
{
s=p->next;
p->next=s->next;
delete s;
return OK;
}
p=p->next;
}
//return OK;
}
//按成绩重新排序结点
Status PX(LinkList &L)
{
int i,j,l;
LNode *p=L->next;
LNode *s,*d;
l=GetLenght(L);
for(i=0;i<l-1;i++)
{
d=L;
for(j=0;j<i+1;j++)
{
if(d->next->data<p->next->data)
{
s=p->next;
p->next=s->next;
s->next=d->next;
d->next=s;
break;
}
d=d->next;
}
p=p->next;
}
return OK;
}
//遍历
Status TraverseList(LinkList L)
{
LNode *p=L->next;
cout<<"=====学生信息====="<<endl;
while(p!=NULL)
{
cout<<"--------------------"<<endl;
cout<<"学号:"<<p->num<<endl;
cout<<"姓名:"<<p->name<<endl;
cout<<"成绩:"<<p->data<<endl;
p=p->next;
}
cout<<"--------------------"<<endl;
return OK;
}
//销毁
void DestroyList(LinkList &L)
{
LNode *p;
while(L!=NULL)
{
p=L->next;
delete L;
L=p;
}
}
//主函数
int main()
{
LinkList L;
InitList(L);//初始化
ElemType cj,xh,result;
ZF xm[20];
int x,n,i;
cout<<"*****************菜单******************"<<endl;
cout<<"======================================="<<endl;
cout<<"*** 0: 增加学生信息 ***"<<endl;
cout<<"*** 1:查找学生信息(按学号) ***"<<endl;
cout<<"*** 2:删除学生信息(按学号) ***"<<endl;
cout<<"*** 3:删除学生信息(按成绩) ***"<<endl;
cout<<"*** 4:按成绩由高分到低分排序 ***"<<endl;
cout<<"*** 5: 显示所有学生信息 ***"<<endl;
cout<<"======================================="<<endl;
loop:
cout<<"请输入对应数字:";
cin>>x;
switch(x)
{
case 0://增加学生信息
cout<<"\n请输入增加学生个数:";
cin>>n;
ZJ(L,n);
break;
case 1://按学号查找学生信息
cout<<"\n请输入学号,查找成绩:";
cin>>xh;
XhGetScore(L,xh,result);
if(result!=-1) cout<<"该生成绩:"<<result<<endl;
break;
case 2://删除学生信息(按学号)
cout<<"\n请输入学号,删除该信息:";
cin>>xh;
XhDelete(L,xh);
break;
case 3://删除学生信息(按成绩)
cout<<"\n请输入成绩,删除该信息:";
cin>>cj;
ScoreDelete(L,cj);
break;
case 4://按成绩排序
cout<<"\n按成绩排序(高分到低分):"<<endl;
PX(L);
TraverseList(L);
break;
case 5:
TraverseList(L);
break;//显示所有学生信息
default:cout<<" ! ! ! 输入信息有误 ! ! ! "<<endl;
}
cout<<"\n*****继续操作,请按1*****"<<endl;
cout<<"*****结束操作,请按2*****\n"<<endl;
cin>>i;
if(i==1) goto loop;
DestroyList(L);//销毁
return 0;
}