C++(3)_ヘテロチェーンメータ

20033 ワード

ついに万悪の期末试験を终えて、落ちたblogを更に少し时间があります
ヘテロチェーンメータ
ヘテロチェーンテーブルmeansチェーンテーブル内のノードタイプは、同じでなくてもよい.以下に、カリキュラムジョブ(小型の学校情報管理システム)におけるメンバータイプ定義を置く.hファイル.抽象ノード(Node)ベースクラスPersonクラスがあり、他のクラスはその上で継承されています.したがって、チェーンテーブル(HeterList)クラスでは、チェーンテーブルヘッダポインタを定義する場合、ヘッダポインタをベースクラスタイプとして定義するだけで、そのヘッダポインタで継承クラスを指すことができる.
#include 
#include 

using namespace std;

//         
class HeterList;

/*
*   ,  class   
*/
//     Person
class Person
{
    friend class HeterList;

public:
    //    
    //Person():_name(""),_sex('M'),_age(0),_IDnumber(""),_next(NULL){}

    Person(char *name, char sex, int age, char *IDnumber)
    :_sex(sex),_age(age),_next(NULL)
    {
        strcpy_s(Person::_name, name);
        strcpy_s(Person::_IDnumber, IDnumber);
    }


    //    
    virtual void addNode() = 0;     //        ,      
    virtual void display() = 0;     //    

    //    
    ~Person() {}

//        ,             
protected:
    char _name[20];
    char _sex;
    int _age;
    char _IDnumber[20];

    static Person *_ptr;    //      Person        
    Person *_next;          //          
};

//   
class Teacher:public Person
{
    friend class HeterList;

public:
    //    
    //Teacher():Person(),_fund(0),_major(""),_salary(0){}

    Teacher(char *name, char sex, int age, char *IDnumber, int fund, char *major, int salary)
        :Person(name, sex, age, IDnumber),_fund(fund),_salary(salary)
        {
            strcpy_s(Teacher::_major, major);
        }


    //            
    void addNode()
    {
        _ptr = new Teacher(_name, _sex, _age, _IDnumber, _fund, _major, _salary);
    }

    //        
    void display()
    {
        cout<<"Name:"<<_name class="hljs-built_in">cout<<"Sex:"<<_sex class="hljs-built_in">cout<<"Age:"<<_age class="hljs-built_in">cout<<"ID NUmber:"<<_idnumber class="hljs-built_in">cout<<"Job: Teacher"<cout<<"Fund:"<<_fund class="hljs-built_in">cout<<"Major:"<<_major class="hljs-built_in">cout<<"Salary:"<<_salary class="hljs-built_in">cout<//    
    ~Teacher() {}

private:
    int _fund;
    char _major[20];
    int _salary;
};

//   
class Stuff:public Person
{
    friend class HeterList;

public:
    //    
    //Stuff():Person(),_department(""),_position(""),_salary(0){}

    Stuff(char *name, char sex, int age, char *IDnumber, char *department, char *position, int salary)
        :Person(name, sex, age, IDnumber),_salary(salary)
    {
        strcpy_s(Stuff::_department, department);
        strcpy_s(Stuff::_position, position);
    }

    void display()
    {
        cout<<"Name:"<<_name class="hljs-built_in">cout<<"Sex:"<<_sex class="hljs-built_in">cout<<"Age:"<<_age class="hljs-built_in">cout<<"ID NUmber:"<<_idnumber class="hljs-built_in">cout<<"Job: Stuff"<cout<<"Department:"<<_department class="hljs-built_in">cout<<"Position:"<<_position class="hljs-built_in">cout<<"Salary:"<<_salary class="hljs-built_in">cout<//            
    void addNode()
    {
        _ptr = new Stuff(_name, _sex, _age, _IDnumber, _department, _position, _salary);
    }

    //    
    ~Stuff() {}

private:
    char _department[20];
    char _position[20];
    int _salary;
};

//    
class Undergraduate:public Person
{
    friend class HeterList;

public:
    //    
    //Undergraduate():Person(),_gradePoint(0){}

    Undergraduate(char *name, char sex, int age, char *IDnumber, int gradePoint)
        :Person(name, sex, age, IDnumber),_gradePoint(gradePoint){}

    void display()
    {
        cout<<"Name:"<<_name class="hljs-built_in">cout<<"Sex:"<<_sex class="hljs-built_in">cout<<"Age:"<<_age class="hljs-built_in">cout<<"ID NUmber:"<<_idnumber class="hljs-built_in">cout<<"Job: Undergraduate"<cout<<"GradePoint:"<<_gradepoint class="hljs-built_in">cout<//            
    void addNode()
    {
        _ptr = new Undergraduate(_name, _sex, _age, _IDnumber, _gradePoint);
    }

    //    
    ~Undergraduate() {}

//        ,             
protected:
    int _gradePoint;
};

//       
class FulltimePostgraduate:public Undergraduate
{
    friend class HeterList;
    //friend class Teacher;

public:
    //    
    //FulltimePostgraduate():Undergraduate(),_major(""),_tutor(""){}

    FulltimePostgraduate(char *name, char sex, int age, char *IDnumber, int gradePoint, char *major, char *tutor)
        :Undergraduate(name, sex, age, IDnumber, gradePoint)
    {
        strcpy_s(FulltimePostgraduate::_major, major);
        strcpy_s(FulltimePostgraduate::_tutor, tutor);
    }

    void display()
    {
        cout<<"Name:"<<_name class="hljs-built_in">cout<<"Sex:"<<_sex class="hljs-built_in">cout<<"Age:"<<_age class="hljs-built_in">cout<<"ID NUmber:"<<_idnumber class="hljs-built_in">cout<<"Job: FulltimePostgraduate"<cout<<"GradePoint:"<<_gradepoint class="hljs-built_in">cout<<"Major:"<<_major class="hljs-built_in">cout<<"Tutor:"<<_tutor class="hljs-built_in">cout<//            
    void addNode()
    {
        _ptr = new FulltimePostgraduate(_name, _sex, _age, _IDnumber, _gradePoint, _major, _tutor);
    }

    //    
    ~FulltimePostgraduate() {}


//        ,             
protected:
    char _major[20];
    char _tutor[20];
};

//      
class OnthejobPostgraduate:public FulltimePostgraduate
{
    friend class HeterList;

public:
    //    
    //OnthejobPostgraduate():FulltimePostgraduate(),_salary(0){}

    OnthejobPostgraduate(char *name, char sex, int age, char *IDnumber, int gradePoint, char *major, char *tutor, int salary)
        :FulltimePostgraduate(name, sex, age, IDnumber, gradePoint, major, tutor),_salary(salary){}

    void display()
    {
        cout<<"Name:"<<_name class="hljs-built_in">cout<<"Sex:"<<_sex class="hljs-built_in">cout<<"Age:"<<_age class="hljs-built_in">cout<<"ID NUmber:"<<_idnumber class="hljs-built_in">cout<<"Job: FulltimePostgraduate"<cout<<"GradePoint:"<<_gradepoint class="hljs-built_in">cout<<"Major:"<<_major class="hljs-built_in">cout<<"Tutor:"<<_tutor class="hljs-built_in">cout<<"Salary:"<<_salary class="hljs-built_in">cout<//            
    void addNode()
    {
        _ptr = new OnthejobPostgraduate(_name, _sex, _age, _IDnumber, _gradePoint, _major, _tutor, _salary);
    }

    //    
    ~OnthejobPostgraduate() {}

//        ,             
protected:
    int _salary;
}; 




//     
class HeterList
{
public:
    //    
    HeterList():Root(NULL){}

    void InsertNode(Person *node);  //        ,              
    void SearchNode(char *name);
    void DeleteNode(char *name);
    void UpdateNode(char *name);
    void displayList(); //  

    //    
    ~HeterList() {}

private:
    Person *Root;   //       
};

void HeterList::InsertNode(Person *node)
{
    //        
    Person *curr = Root;    //         , Root  
    Person *prev = NULL;    //          

    //           
    //          , curr=Root=NULL
    while( curr != NULL )
    {
        //      
        prev = curr;
        curr = curr->_next;
    }

    node->addNode();//           ptr
    node->_ptr->_next = curr; //        
    if(prev==NULL)  //        
    {
        Root = node->_ptr;
    }
    else
    {
        prev->_next = node->_ptr;   
    }

}

void HeterList::SearchNode(char *name)
{
    Person *curr = Root;    //         ,     

    while( (curr!=NULL) && (strcmp(curr->_name, name) !=0) )
    {//     ,       
        curr = curr->_next;
    }
    if( curr == NULL )
    {//   
        cout<<"Can't find this member, please check it again!"<else 
    {
        curr->display();
    }
}

void HeterList::DeleteNode(char *name)
{
    Person *curr = Root;    //         ,     
    Person *prev = NULL;    //          

    while( (curr!=NULL) && (strcmp(curr->_name, name) !=0) )
    {//     ,       
        prev = curr;
        curr = curr->_next;
    }
    if( (prev==NULL) && (curr!=NULL) )
    {//curr        , Root  
        Root = curr->_next;
        delete curr;
    }
    else if( (prev!=NULL) && (curr!=NULL) )
    {//     
        prev->_next = curr->_next;
        delete curr;
    }
}

void HeterList::UpdateNode(char *name)
{
    Person *curr = Root;    //         ,     
    Person *prev = NULL;    //          

    while( (curr!=NULL) && (strcmp(curr->_name, name) !=0) )
    {//     ,       
        prev = curr;
        curr = curr->_next;
    }
    if( curr == NULL )
    {//   
        cout<<"Can't find this member, please check it again!"<else
    {//   

    }
}

void HeterList::displayList()
{
    Person *curr = Root;
    while(curr != NULL)
    {
        curr->display();
        curr = curr->_next;
    }
}