C++学校实验(链表实现)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > C++学校实验(链表实现)

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

 2011/1/9 9:14:50  Tveiker  http://tveiker.javaeye.com  我要评论(0)
  • 摘要:近日已经临近考试了,想起啊我还有一个数据结构关于链表的实验未作,昨天折腾了一晚上,但是有个问题还是未解决。其问题就是:一个学生的信息:1、姓名2、学号3、性别4、年龄用一个链表将其连接起来,从外界输入一个年龄,将与该年龄一样的学生全从链表中删除分析:对于该实验给出一个ADTstudent操作对象:其基本信息(私有成员变量)基本操作:student();//构造默认参数学生student(char*name,char*sex,intage);//构造指定参数的学生~student()
  • 标签:实现 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();
}

但是学生学号问题没解决...
上一篇: daughter of emotions 下一篇: plug the cyclone
发表评论
用户名: 匿名