C++学校实验(链表实现)
近日已经临近考试了,想起啊我还有一个数据结构关于链表的实验未作,昨天折腾了一晚上,但是有个问题还是未解决。
其问题就是:
一个学生的信息:
1、姓名
2、学号
3、性别
4、年龄
用一个链表将其连接起来,从外界输入一个年龄,将与该年龄一样的学生全从链表中删除
分析:对于该实验给出一个
ADT student
操作对象:其基本信息(私有成员变量)
基本操作:
student();//构造默认参数学生
student(char *name,char *sex,int age);//构造指定参数的学生
~student()://删除学生
display();//显示学生信息
student &operator=(student &s);//重载=用于后面链表的赋值
对于链表的结构
ADT Link
操作对象:学生Student
Link()//构造空表
Delete()//删除一个元素
Add(Student &s)//向链表中添加s
Display()//显示链表
~Link();//释放链表
其代码如下:
#include<iostream>#include<string>using namespace std;class Link;/***对于学号的问题还在研究中,由于拷贝函数、构造函数用的比较杂,没有实现每次加1,但是链表功能还是实现了*/class Student{ friend class Link;public: Student(); Student(Student &); Student(char *name,char* sex,int age); void display(); Student &operator=(Student &s); ~Student();private: char *Name; int age; char *Sex; int no; Student *next; int static Stu_no;};int Student::Stu_no=2009000;Student::Student(){ no=Stu_no++; Name=new char[2]; strcpy(Name,"X"); Sex=new char[4]; strcpy(Sex,"Boy"); age=20;}Student::Student(char *name,char* sex,int age){ no=Stu_no++; this->age=age; Name=new char[strlen(name)+1]; strcpy(Name,name); Sex=new char[strlen(sex)+1]; strcpy(Sex,sex);}Student::Student(Student &s){ no=Stu_no++; this->age=s.age; Name=new char[strlen(s.Name)+1]; strcpy(Name,s.Name); Sex=new char[strlen(s.Sex)+1]; strcpy(Sex,s.Sex); next=new Student;}Student &Student::operator =(Student &s){ this->age=s.age; Name=new char[strlen(s.Name)+1]; strcpy(Name,s.Name); Sex=new char[strlen(s.Sex)+1]; strcpy(Sex,s.Sex); return *this;}Student::~Student(){ delete []Name; delete []Sex; Stu_no--;}void Student::display(){ cout<<Name<<" "<<no<<" "<<Sex<<" "<<age<<endl;}class Link{public: Link(); void Delete(int); void Add(Student& s); void Display(); ~Link();private: Student *pHead; Student *pTail; Student *pivot;};Link::Link(){//构造空链表 pHead=NULL;; pTail=NULL; pivot=NULL;}Link::~Link(){//释放内存 pivot=pHead; Student *p; while(pivot){ p=pivot; pivot=pivot->next; delete p; }} void Link::Add(Student &s){//向链表中加如学生s if(pHead==NULL){ pHead = new Student(s); pTail=pHead; pTail->next=NULL; } else{ Student *st=new Student(s); pTail->next=st; pTail=st; pTail->next=NULL; }}void Link::Display(){//显示链表中学生信息 pivot=pHead; while(pivot){ pivot->display(); pivot=pivot->next; } if(pHead)//非空,每次显示一条链表画下划线 cout<<"-------------------"<<endl;}void Link::Delete(int age){//删除链表中所有年龄为age的学生 int yes=0;//记录是否有age的学生 Student *p=pHead,*q; if(p&&p->age==age){//如果链表首为age删除 do{ cout<<"删去了"; pHead->display(); yes=1; pHead=p->next; cout<<"-------------------"<<endl; delete p; p=pHead; }while(p&&p->age==age); } while(p){//其他地方 q=p->next;//q为删除的元素,p记录其上一个元素 if(q&&q->age==age){ p->next=q->next; cout<<"删去了"; q->display(); yes=1; delete q; cout<<"-------------------"<<endl; } else if(!q&&yes==0){ cout<<"没有"<<age<<"岁的学生"<<endl; cout<<"-------------------"<<endl; return; } else p=p->next; }}void main(){ Student s1("X","Boy",22); Student s2("Y","Boy",20); Student s3("Z","Boy",21); Student s4("U","Girl",22); Link l; l.Add(s1); l.Add(s2); l.Add(s3); l.Add(s4); l.Display(); l.Delete(21); l.Display();}但是学生学号问题没解决...