关闭

多态性的异质单向链

标签: 多态性的异质单向链 C++控制台多态链表
599人阅读 评论(0) 收藏 举报
分类:

              多态性的异质单向链

     其要点是:先为异质链表上各被链对象建立一个公共基类,即把链表上的各个不同类型的对象统一成一种类型,并在此基类中定义有关的虚函数,然后构造含有统一的对象指针类型转换形式的函数调用界面。 


// Class_inherit.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"


class DLinList;
class Person //基类 Person
{ friend class DLinList;
protected:
char name[10]; //姓名
int age; //年龄
Person *next; //下一个结点指针
static Person *point; //static基类指针
public:
Person(char *nm,int ag);
~Person(void){ }
virtual void CreatNode(void){ }; //空的虚函数
virtual void Print(void); //虚函数
};


Person::Person(char *nm,int ag)
{
strcpy(name,nm);
age=ag;
next=NULL;
}
void Person::Print(void)
{
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
}


class student:public Person //派生类student
{
private:
float score; //学习成绩
public:
student(char *nm, int ag, float sc):Person(nm,ag)
{score=sc;}
~student(void){ }
void CreatNode(void); //虚函数
void Print(void); //虚函数
};


void student::CreatNode(void)
{
//创建Professor类的动态对象并由类指针变量point指示
point=new student(name,age,score);
}


void student::Print(void)
{
Person::Print(); //调用基类的Print()
cout<<"入学成绩:"<<score<<endl<<endl;
}


class teacher:public Person //派生类professor
{
private:
char  position[15];//职称
 public:
    teacher(char *nm, int ag, char *pos):Person(nm,ag)
{ strcpy(position,pos);}
~teacher(void){ }
void CreatNode(void); //虚函数
void Print(void); //虚函数
};


void teacher::CreatNode(void)
{
//创建Professor类的动态对象并由类指针变量point指示
point=new teacher(name,age,position);
}


void teacher::Print(void)
{
Person::Print(); //调用基类的Print()
cout<<"职称:"<<position<<endl<<endl;
}


class Staff:public Person //派生类Staff
{
private:
char Comment; //业绩评级
public:
Staff(char *nm, int ag, char cm):Person(nm,ag)
{Comment=cm;}
~Staff(void){}
void CreatNode(void); //虚函数
void Print(void); //虚函数
};


void Staff::CreatNode(void) 
{
//创建Staff类的动态对象并由类指针变量point指示
point=new Staff(name,age,Comment);
}


void Staff::Print(void)
{
Person::Print(); //调用基类的Print()
cout<<"业绩评级:"<<Comment<<endl<<endl;
}


class DLinList //异质单链表类
{private:
Person *head; //头指针为基类Person 的指针
int size; //异质单链表结点个数
 public:
DLinList(void):head(NULL),size(0){ } //构造函数
~DLinList(void); //析构函数
Person *Index(int pos) const; //定位pos
void Insert(Person *p,int pos);    //在第pos个结点前插入指针p所指结点
void Delete(int pos); //删除第pos个结点
void Print(void); //依次输出异质单链表结点的数据域值
};


DLinList::~DLinList(void) //析构函数
{
Person *curr, *prev;
curr=head; //curr指向第一个结点
while(curr != NULL) //循环释放所有结点空间
{ prev = curr;
curr = curr->next;
delete prev;
}
size=0; //结点个数置为初始化值0
}


Person *DLinList::Index(int pos) const
//定位pos, 函数返回指向第pos 个结点的指针
{ if(pos < -1 || pos > size)
{ cout<<"参数pos越界出错!"<<endl;
exit(1);
}
if(pos == -1) return head; //pos为-1时,返回头指针head
Person *curr=head; //curr指向第一个结点
int i =0; //从0 开始记数
while(curr != NULL && i < pos) //寻找第pos个结点
{ curr=curr -> next;
i++;
}
return curr; //返回第pos个结点指针
}


void DLinList::Insert(Person *p, int pos)
//在第pos个结点前插入指针p所指结点
//注意指针p定义为基类Person 的指针
{ if( pos < 0 || pos > size)
{ cout<<"参数pos越界出错!"<<endl;
exit(1);
}
Person *prev = Index(pos - 1);
//prev指向第pos - 1个结点  //10

//根据指针p 当前的赋值,创建相应类的对象结点
//新创建的结点由类指针变量point 指示
p -> CreatNode();
if ( pos == 0) //当插入到链头位置时
{ Person::point ->next = head; //原链头赋给新结点的next域
head = Person::point; //头指针指向新结点
}
else //当插入到非链头位置时
{ Person::point ->next = prev ->next; //新插入结点的后边部分勾链
prev ->next = Person::point; //新插入结点勾链
}
size++;
}


void DLinList::Delete( int pos) //删除第pos个结点
{ if( pos < 0 || pos > size)
{ cout<<"参数pos越界出错!"<<endl;
exit(1); }
Person *kill;
Person *prev = Index(pos - 1); //prev指向第pos - 1个结点
if ( pos == 0) //当删除结点为第一个结点时
{ kill = prev; //kill 指向第一个结点
head = head ->next; //head指向第二个结点
}
else //当删除结点不为第一个结点时
{ kill  = prev ->next; //kill 指向第pos个结点
prev ->next = prev -> next -> next; //第pos 个结点脱链
}
delete kill;   //释放kill所指结点空间
size--; //结点个数减1
}


void DLinList::Print(void)
//依次输出异质单链表结点的数据域值
{
Person *curr = head;
while ( curr != NULL)
{
curr -> Print();
curr = curr -> next;
}
}


Person *Person::point = NULL; //初始化类指针变量point
void main(void)
{ DLinList personList;
student stud1("张群",20,88);
teacher teac1("李鹏",50,"教授");
teacher teac2("刘清",32,"讲师");
Staff staf1("王飞",30,'A');
personList.Insert(&stud1,0); //把prof1插入到personList的第1个结点中
personList.Insert(&teac1,1);
personList.Insert(&teac2,2);
personList.Insert(&staf1,3);
personList.Delete(2); //删除personList中的第4个结点
personList.Print(); //依次输出显示personList各结点的数据域值
}


其运行结果为:


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:60843次
    • 积分:1084
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:44篇
    • 译文:1篇
    • 评论:3条
    最新评论