首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++学校实验(链表兑现)

2012-12-25 
C++学校实验(链表实现)近日已经临近考试了,想起啊我还有一个数据结构关于链表的实验未作,昨天折腾了一晚上

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();}

但是学生学号问题没解决...

热点排行