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