c++数据结构学生管理系统.docx
c+数据结构学生管理系统C+数据结构学生管理系统 单链表实现 用模板类实现,实现操作符的重载 非常详细的代码及其操作 1、 Student.h private: 2 、 string name;/ 姓名 string ID;/学号 string sex;/性别 string major;/专业 string brithday;/生日 int ave;/均分 Student; void SetName(string& strname); void SetSex(string& strsex); void SetBrith(string& strbrith); void SetID(string& strID); void SetMajor(string& strmajor); void EditPerson; bool operator !=(Student& stu); bool operator>(Student& stu); friend ostream& operator<<(ostream& ost,Student& stu); friend ifstream& operator>>(ifstream& ost,Student& stu); friend ofstream& operator<<(ofstream& ost,Student& stu); string GetName; 2、核心代码 ostream& operator<<(ostream& ost,Student& stu) ost<<"Name "<<stu.name<<endl; ost<<"Sex "<<stu.sex<<endl; ost<<"Brithday "<<stu.brithday<<endl; ost<<"ID "<<stu.ID<<endl; ost<<"Major "<<stu.major<<endl; return ost; 3、测试代码 ifstream& operator>>(ifstream& ost,Student& stu) ost>>stu.name; ost>>stu.sex; ost>>stu.brithday; ost>>stu.ID; ost>>stu.major; return ost; ofstream& operator <<(ofstream& ost,Student& stu) ost<<stu.name<<endl; ost<<stu.sex<<endl; ost<<stu.brithday<<endl; ost<<stu.ID<<endl; ost<<stu.major<<endl; return ost; bool Student:operator !=(Student& stu) if(stu.name=name) return false; return true; bool Student:operator >(Student& stu1) if(stu1.ave>ave) return true; return false; Casea: system("cls"); /stu.EditPerson; cout<<"请输入学生的姓名"<<endl; cin>>name; stu.SetName(name); cout<<"请输入学生的性别"<<endl; cin>>sex; stu.SetSex(sex); cout<<"请输入学生的生日"<<endl; cin>>brithday; stu.SetBrith(brithday); cout<<"请输入学生的学号"<<endl; cin>>ID; stu.SetID(ID); cout<<"请输入学生的专业"<<endl; cin>>major; stu.SetMajor(major); cout<<"请输入平均成绩"<<endl; cin>>ave; stu.SetAve(ave); list.Insert(1,stu); list.Save("Student.txt"); cout<<"请输入选择: "<<endl; break; case'b': system("cls"); list.PrintLinkList; cout<<"请输入选择: "<<endl; break; case'c': cout<<"当前链表的长度为:"<<endl; length=list.ListLength; case'd': system("cls"); cout<<"现有学生的名字:"<<endl; list.DisplayName; cout<<endl; cout<<"请输入学生的姓名"<<endl; cin>>name; stu.SetName(name); delstu=list.Find(stu); case'd': cout<<"现有学生的名字:"<<endl; list.DisplayName; cout<<endl; cout<<"请输入学生的姓名"<<endl; cin>>name; stu.SetName(name); delstu=list.Find(stu); cout<<delstu; 3、 源代码 case'f': system("cls"); cout<<"现有学生的名字:"<<endl; list.DisplayName; cout<<"请输入修改的学生的姓名:"<<endl; cin>>name; tu.SetName(name); delstu=list.Find(stu); pos=list.Locate(stu); list.Delete(pos); cout<<"请输入学生的新的信息:"<<endl; cout<<endl; cout<<"请输入学生的姓名"<<endl; cin>>name; stu.SetName(name); cout<<"请输入学生的性别"<<endl; cin>>sex; stu.SetSex(sex); cout<<"请输入学生的生日"<<endl; cin>>brithday; stu.SetBrith(brithday); cout<<"请输入学生的学号"<<endl; cin>>ID; stu.SetID(ID); cout<<"请输入学生的专业"<<endl; cin>>major; stu.SetMajor(major); cout<<"请输入平均成绩"<<endl; cin>>ave; stu.SetAve(ave); case'g': list.Sort; list.PrintLinkList; LinkList.h #ifndef LinkList_H #define LinkList_H #include <windows.h> #include<fstream> using namespace std; template<class T> struct Node T data; Node<T> *next; ; template<class T> class LinkList 值 序号 /元素自身的信息,数据域 /后继元素存储地址,地址域 Node<T> *head; public: LinkList; LinkList(T a,int n); void SetLinList(T a,int n); LinkList; int ListLength; T Get(int pos); T Find(T item); int Locate(T item); void PrintLinkList; /单链表的头指针 /求链表的长度 /按位查找,取单链表中第POS个节点的元素/查找函数,以T类型的数据作为参数 /按值查找,求单链表中值为item的元素的 void Insert(int i,T item); /在i的位置插入元素item T Delete(int i); /在单链表中删除第i个节点,并返回这个值 void Invert; /逆置函数 friend void Merge(LinkList<T> &L1,LinkList<T> &L2);/归并链表 void DisplayNode(int i); void Save(char fname); void Open(char fname); /保存 /显示名字 /排序 void DisplayName; void Sort; ; #endif LinkList.cpp #include"LinkList.h" template<class T> /用于创建一个带有头结点的空链表 LinkList<T>:LinkList head=new Node<T>/私有 head->next=NULL; template<class T> /* 用于创建一个带有头结点的空链表 */ LinkList<T>:LinkList(T a,int n)/尾插法 Node<T> *rear; rear=head;/指向当前单链表的最后一个节点 for(int i=0;i<n;i+) Node<T> *s; s=new Node<T> s->data=ai; rear->next=s;/rear=head rear=s;/rear一直是指向单链表的最后一项 rear->next=NULL;/单链表创建结束,最后一个节点的指针置为空 template<class T> void LinkList<T>:SetLinList(T a,int n) head=new Node<T> Node<T> *rear=head; for(int i=0;i<n;i+) Node<T> *s; s=new Node<T> s->data=ai; rear->next=s; rear=s; rear->next=NULL;/单链表创建结束,最后一个节点的指针置为空 template<class T> int LinkList<T>:ListLength int num=0; Node<T> *p; p=head->next; while(p) p=p->next; num+; return num; template<class T> T LinkList<T>:Get(int pos) Node<T> *p; int j=1; p=head->next;/p指向头结点的下一个节点 while(p&&j<pos) p=p->next; j+; if(!p|j>pos) cout<<"查找位置非法" exit(1); else return p->data; template<class T> T LinkList<T>:Find(T item) Node<T> *p; p=head->next; while(p&&p->data!=item) p=p->next; if(!p) cout<<"查找位置非法" exit(1); else return p->data; template<class T> int LinkList<T>:Locate(T item) Node<T> *p; p=head->next; int j=1; while(p&&p->data!=item) p=p->next; j+; if(p) return j; else return 0; template<class T> void LinkList<T>:PrintLinkList Node<T> *p; p=head->next; while(p) cout<<p->data<<" " p=p->next; template<class T> void LinkList<T>:Insert(int i,T item) Node<T> *p; p=head; int j=0; while(p&&j<i-1) p=p->next; j+; if(!p) cerr<<"插入位置非法" exit(1); else Node<T> *s=new Node<T> s->data=item; s->next=p->next; p->next=s; template<class T> T LinkList<T>:Delete(int i) Node<T> *p,*q; T x; p=head; int j=0; while(p&&j<i-1) p=p->next; j+; if(!p|!p->next) cerr<<"位置非法" exit(1); else q=p->next; x=q->data; p->next=q->next; delete q; return x; /*利用头插法*/ template<class T> void LinkList<T>:Invert Node<T> *p; p=head->next; head->next=NULL;/将逆置后的单链表初始化为空表 while(p!=NULL) Node<T> *q=p; p=p->next; q->next=head->next; head->next=q; template<class T> LinkList<T>:LinkList Node<T> *q=new Node<T> while(head!=NULL) q=head; head=head->next; delete q; template<class T> void Merge(LinkList<T> &L1,LinkList<T> &L2)/归并链表 Node<T> *p1,*p2,*p3; p1=L1.head->next;/指向第一个数据的节点 p2=L2.head->next; p3=L1.head;/指向L1的头结点 while(p1!=NULL)&&(p2!=NULL) if(p1->data)<(p2->data) p3->next=p1; p1=p1->next; p3=p3->next; else p3->next=p2; p2=p2->next; p3=p3->next; if(p1!=NULL)/p2为空的时候 p3->next=p1; if(p2!=NULL) p3->next=p2; delete L2.head; L2.head=NULL; template<class T> void LinkList<T>:Save(char fname) ofstream fout(fname); fout<<ListLength<<endl; Node<T> *p; p=head->next; while(p!=NULL) fout<<p->data<<endl; p=p->next; fout.close; template<class T> void LinkList<T>:Open(char fname) ifstream fin(fname); int n; fin>>n; T item; for(int i=0;i<n;i+) / Node<T> *p=new Node<T> / fin>>p->data; fin>>item; Insert(i+1,item); fin.close; template<class T> void LinkList<T>:DisplayName Node<T> *p; p=head->next; while(p) cout<<p->data.GetName<<endl; p=p->next; template<class T> void LinkList<T>:Sort Node<T> *p; int len=ListLength; for(int i=1;i<len;i+) p=head->next; for(int j=0;j<len-i;j+) if(p->data>p->next->data) T temp=p->data; p->data=p->next->data; p->next->data=temp; p=p->next; Student.h #include"LinkList.h" #include<string> #include<fstream> using namespace std; class Student; ostream& operator<<(ostream& os,Student &stu); ifstream& operator>>(ifstream& ost,Student& stu); ofstream& operator <<(ofstream& ost,Student& stu); class Student private: string name;/姓名 string ID;/学号 string sex;/性别 string major;/专业 string brithday;/生日 int ave;/均分 public: Student; void SetName(string& strname); void SetSex(string& strsex); void SetBrith(string& strbrith); void SetID(string& strID); void SetMajor(string& strmajor); void SetAve(int strave); void EditPerson; bool operator !=(Student& stu); bool operator>(Student& stu); friend ostream& operator<<(ostream& ost,Student& stu); friend ifstream& operator>>(ifstream& ost,Student& stu); friend ofstream& operator<<(ofstream& ost,Student& stu); string GetName; ; Student.cpp #include"Student.h" #include<iostream> using namespace std; ostream& operator<<(ostream& ost,Student& stu) ost<<"Name "<<stu.name<<endl; ost<<"Sex "<<stu.sex<<endl; ost<<"Brithday "<<stu.brithday<<endl; ost<<"ID "<<stu.ID<<endl; ost<<"Major "<<stu.major<<endl; ost<<"Average "<<stu.ave<<endl; return ost; ifstream& operator>>(ifstream& ost,Student& stu) ost>>stu.name; ost>>stu.sex; ost>>stu.brithday; ost>>stu.ID; ost>>stu.major; ost>>stu.ave; return ost; ofstream& operator <<(ofstream& ost,Student& stu) ost<<stu.name<<endl; ost<<stu.sex<<endl; ost<<stu.brithday<<endl; ost<<stu.ID<<endl; ost<<stu.major<<endl; ost<<stu.ave<<endl; return ost; Student:Student void Student:SetName(string& strname) name=strname; void Student:SetSex(string& strsex) sex=strsex; void Student:SetBrith(string& strbrith) brithday=strbrith; void Student:SetID(string& strID) ID=strID; void Student:SetMajor(string& strmajor) major=strmajor; void Student:SetAve(int strave) ave=strave; bool Student:operator !=(Student& stu) if(stu.name=name) return false; return true; bool Student:operator >(Student& stu1) if(stu1.ave>ave) return true; return false; string Student:GetName return name; void Student:EditPerson Test.cpp #include"LinkList.cpp" #include"Student.h" #include<iostream> #include<string> #include<windows.h> using namespace std; void menu cout<<"a、增加一个学生信息"<<endl; cout<<"b、打印链表"<<endl; cout<<"c、获取当前链表的长度"<<endl; cout<<"d、查询学生的信息"<<endl; cout<<"e、删除学生信息"<<endl; cout<<"f、修改学生的信息"<<endl; cout<<"g、按平均成绩进行排序"<<endl; cout<<"h、帮助"<<endl; cout<<"o、退出"<<endl; void main char ch; LinkList<Student> list; list.Open("Student.txt"); string name,sex,ID,brithday,major,newname; int length,pos,ave; Student stu,delstu; menu; cout<<"input"<<endl; do ch=getchar; switch(ch) case'h': system("cls"); menu; break; case'a': system("cls"); /stu.EditPerson; cout<<"请输入学生的姓名"<<endl; cin>>name; stu.SetName(name); cout<<"请输入学生的性别"<<endl; cin>>sex; stu.SetSex(sex); cout<<"请输入学生的生日"<<endl; cin>>brithday; stu.SetBrith(brithday); cout<<"请输入学生的学号"<<endl; cin>>ID; stu.SetID(ID); cout<<"请输入学生的专业"<<endl; cin>>major; stu.SetMajor(major); cout<<"请输入平均成绩"<<endl; cin>>ave; stu.SetAve(ave); list.Insert(1,stu); list.Save("Student.txt"); cout<<"请输入选择: "<<endl; break; case'b': system("cls"); list.PrintLinkList; cout<<"请输入选择: "<<endl; break; case'c': system("cls"); cout<<"当前链表的长度为:"<<endl; length=list.ListLength; cout<<"length="<<length<<endl; cout<<"请输入选择: "<<endl; break; case'd': system("cls"); cout<<"现有学生的名字:"<<endl; list.DisplayName; cout<<endl; cout<<"请输入学生的姓名"<<endl; cin>>name; stu.SetName(name); delstu=list.Find(stu); cout<<delstu; cout<<"请输入选择: "<<endl; break; case'e': system("cls"); cout<<"现有学生的名字:"<<endl; list.DisplayName; cout<<"请输入删除学生的姓名" cin>>name; stu.SetName(name); pos=list.Locate(stu); delstu=list.Delete(pos); cout<<endl; list.PrintLinkList; list.Save("Student.txt"); cout<<"请输入选择: "<<endl; break; case'f': system("cls"); / cout<<"现有学生的名字:"<<endl; list.DisplayName; cout<<"请输入修改的学生的姓名:"<<endl; cin>>name; stu.SetName(name); delstu=list.Find(stu); pos=list.Locate(stu); list.Delete(pos); cout<<"请输入学生的新的信息:"<<endl; stu.EditPerson; cout<<endl; cout<<"请输入学生的姓名"<<endl; cin>>name; stu.SetName(name); cout<<"请输入学生的性别"<<endl; cin>>sex; stu.SetSex(sex); cout<<"请输入学生的生日"<<endl; cin>>brithday; stu.SetBrith(brithday); cout<<"请输入学生的学号"<<endl; cin>>ID; stu.SetID(ID); cout<<"请输入学生的专业"<<endl; cin>>major; stu.SetMajor(major); cout<<"请输入平均成绩"<<endl; cin>>ave; stu.SetAve(ave); list.Insert(pos,stu); list.PrintLinkList; list.Save("Student.txt"); cout<<"请输入选择: "<<endl; break; case'g': list.Sort; list.PrintLinkList; case'o': exit(0); break; while(1);