用c++语言 编写基于链表的学生信息管理系统,要求(1)插入节点,输入学生信息后生成结点并插入链表;(2)删除节点,根据姓名或学号删除;(3)查找结点,根据姓名或学号查询并显示;(4)查找并显示成绩最高和最低的学生信息;(5)统计链表中学生人数。
用类来实现链表功能。cLink类用来管理结点及指向下一个结点指针,cList用来对链表管理,提供链表操作。
#include<iostream.h> #include<string.h> class cLink { friend class cList; cLink *next; char name[20]; int number; char sex[10]; int year; int month; int day; int Chinese; int Math; int English; int grade; public: cLink(char *x="",int k=0,char *y="NULL",int dt1=0,int dt2=0,int dt3=0,int dt4=0,int dt5=0,int dt6=0) {strcpy(name,x);number=k;strcpy(sex,y);year=dt1;month=dt2;day=dt3;Chinese=dt4;Math=dt5;English=dt6;} cLink *get_next(){return(next);} void set_number(int dt){number=dt;} void set_sex(char *str){strcpy(sex,str);} void set_year(int dt){year=dt;} void set_month(int dt){month=dt;} void set_day(int dt){day=dt;} void set_Chinese(int dt){Chinese=dt;} void set_Math(int dt){Math=dt;} void set_English(int dt){English=dt;} void print_all(){cout<<"name"<<'\t'<<"number"<<'\t'<<"sex"<<'\t'<<"birthday"<<'\t'<<"Chinese"<<'\t'<<"Math"<<'\t'<<"English"<<'\t'<<"grade"<<'\n';} void print_data(){cout<<name<<'\t'<<number<<'\t'<<sex<<'\t'<<year<<"."<<month<<"."<<day<<"\t"<<Chinese<<'\t'<<Math<<'\t'<<English<<'\t'<<stugrade()<<'\n';} int stugrade(){grade=Chinese+Math+English;return grade;} }; class cList { protected: cLink *first; cLink *last; public: cList(){first=last=new cLink;} ~cList(){Clear();delete first;} cList &Insert(const cLink &); cList &Deletename(); cList &Deletenumber(); cList &Searchname(); cList &Searchnumber(); void grade(); void statistics(); void Print(); cList &Clear(); }; //表头插入学生信息 cList &cList::Insert(const cLink &x) { cLink *ptr=first; first=new cLink; *first=x; first->next=ptr; return(*this); } //通过姓名删除信息 cList &cList::Deletename() { cout<<"请输入要删除的学生姓名"<<'\n'; char s[20]; cin>>s; cLink *ptr=first,*q; while(ptr!=last&&strcmp(ptr->name,s)){ q=ptr; ptr=ptr->next; } if(ptr!=last&&ptr!=first){ q->next=ptr->next; delete ptr; cout<<"学生信息已删除"<<'\n';} if(ptr==first){ first=ptr->next; delete ptr; cout<<"学生信息已删除"<<'\n';} if(ptr==last) cout<<"列表中没有此人"<<'\n'; return(*this); } //通过学号删除信息 cList &cList::Deletenumber() { cout<<"请输入要删除的学生学号"<<'\n'; int s; cin>>s; cLink *ptr=first; cLink *q=NULL; while(ptr!=last&&ptr->number!=s){ q=ptr; ptr=ptr->next; } if(ptr!=last&&ptr!=first){ q->next=ptr->next; delete ptr; cout<<"学生信息已删除"<<'\n';} if(ptr==first){ first=ptr->next; delete ptr; cout<<"学生信息已删除"<<'\n';} if(ptr==last) cout<<"列表中没有此人"<<'\n'; return(*this); } //通过姓名查找 cList &cList::Searchname() { cout<<"输入想要查找的学生姓名"<<'\n'; char s[20]; cin>>s; cLink *ptr=first; while(ptr!=last&&strcmp(ptr->name,s)){ ptr=ptr->next; } if(ptr!=last){ ptr->print_all(); ptr->print_data();} else cout<<"列表中没有此人信息"<<'\n'; return(*this); } //通过学号查找 cList &cList::Searchnumber() { cout<<"输入想要查找的学生学号"<<'\n'; int s; cin>>s; cLink *ptr=first; while(ptr!=last&&ptr->number!=s){ ptr=ptr->next; } if(ptr!=last){ ptr->print_all(); ptr->print_data();} else cout<<"列表中没有此人信息"<<'\n'; return(*this); } //查找成绩最高和最低的学生 void cList::grade() { cLink *ptr=first,*p,*q; p=first;q=first; while(ptr!=last){ if(p->stugrade()<ptr->stugrade())p=ptr; if(q->stugrade()>ptr->stugrade())q=ptr; ptr=ptr->next; } if(p!=q){ cout<<"成绩最高学生信息为:"<<'\n'; p->print_all();p->print_data(); cout<<"成绩最低学生信息为:"<<'\n'; q->print_all();q->print_data();} else{ cout<<"表中只有一人,其信息为:"<<'\n'; p->print_all();p->print_data();} } //统计链表中学生人数 void cList::statistics() { cLink *ptr=first; int number=0; while(ptr!=last){ number++; ptr=ptr->next; } cout<<"链表中学生人数为:"<<number<<"人"<<'\n'; } //删去所有节点 cList &cList::Clear() { cLink *ptr=first; while(ptr!=last){ cLink *next=ptr->next; delete ptr; ptr=next; } first=last; cout<<"所有信息已删除"<<'\n'; return(*this); } //显示信息 void cList::Print() { cout<<'\n'; cout<<"-------------------------------list------------------------------"<<'\n'; cLink *ptr=first; if(first==last) cout<<"表中没有任何信息"<<'\n'; else{ ptr->print_all(); while(ptr!=last){ ptr->print_data(); ptr=ptr->next;} } } void main(){ cList x; x.Insert(cLink("jin",2014009,"woman",1996,8,11,12,13,14)); int j=1; while(j){ cout<<"\n"; cout<<"----------------学生学籍管理系统----------------"<<'\n'; cout<<'\n'; cout<<" 1.学生信息插入"<<'\n'; cout<<" 2.删除学生信息"<<'\n'; cout<<" 3.查询学生信息"<<'\n'; cout<<" 4.查询最高分与最低分学生信息"<<'\n'; cout<<" 5.统计链表中学生人数"<<'\n'; cout<<" 6.显示所有学生信息"<<'\n'; cout<<" 7.清除所有学生信息"<<'\n'; cout<<" 8.退出系统"<<'\n'; cout<<'\n'; cout<<"------------------------------------------------"<<'\n'; cout<<'\n'; cout<<"请输入要进行的操作"<<'\n'; int i; cin>>i; switch(i){ case 1: cout<<"请输入学生姓名"<<'\n'; char s1[20]; cin>>s1; cout<<"请输入学生学号,例如2014001"<<'\n'; int dt1; cin>>dt1; cout<<"请输入学生性别,man OR woman"<<'\n'; char s2[10]; cin>>s2; cout<<"请输入学生出生年份"<<'\n'; int dt2; cin>>dt2; cout<<"请输入学生出生月份"<<'\n'; int dt3; cin>>dt3; cout<<"请输入学生出生日期"<<'\n'; int dt4; cin>>dt4; cout<<"请输入学生语文成绩(0~100)"<<'\n'; int dt5; cin>>dt5; cout<<"请输入学生数学成绩(0~100)"<<'\n'; int dt6; cin>>dt6; cout<<"请输入学生英语成绩(0~100)"<<'\n'; int dt7; cin>>dt7; x.Insert(cLink(s1,dt1,s2,dt2,dt3,dt4,dt5,dt6,dt7)); break; case 2: cout<<"您想通过姓名还是学号删除?a.姓名;b.学号"<<'\n'; char s; cin>>s; if(s=='a')x.Deletename(); if(s=='b')x.Deletenumber(); break; case 3: cout<<"您想通过姓名还是学号查询?a.姓名;b.学号"<<'\n'; char m; cin>>m; if(m=='a')x.Searchname(); if(m=='b')x.Searchnumber(); break; case 4: x.grade(); break; case 5: x.statistics(); break; case 6: x.Print(); break; case 7: x.Clear(); break; case 8: j=0;break; } } }