多态性的异质单向链

翻译 2013年12月04日 18:09:13

              多态性的异质单向链

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


// 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各结点的数据域值
}


其运行结果为:


最简单的异质链表---链表中存放不同类型的对象/结点

我们已经很熟悉链表了, 到目前为止, 我们接触到的链表中的结点类型都是相同的。 但是, 在实际中, 很多场景都要用链表来管理不同类型的对象/结点, 这样的链表叫异质链表, 它非常常见, 也很实用。 异...
  • stpeace
  • stpeace
  • 2014年11月30日 22:03
  • 4022

重新认识链表(单向链表并遍历)

接触了数据结构 发现无非就是 数据的存储问题和解决办法 那么就是  线性和非线性 最基础的就是  线性表(数组和链表)   不得不又重新 拾起 C语言,也是我比较头痛的 指针问题。 C语言实训的时候...
  • sinat_25926481
  • sinat_25926481
  • 2015年08月31日 19:56
  • 1211

数组,异质结构以及指针的详解

数组,异质结构以及指针的详解 前言 昨天看了一部韩国电影,老千2,看到凌晨5点,不过发现韩国的棒子们确实养眼,女的贼拉漂亮,还有大尺度哦~ 咱们上一次分析了过程(方法)的实现,其中精妙...
  • shanyongxu
  • shanyongxu
  • 2015年08月20日 16:10
  • 947

数据结构学习之单向链表结构

注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流。 转载请注明来自: http://blog.csdn.net/ab198604/ 最近突然间觉得应该补补IT技术的基础的知识,因为对...
  • FreeTourW
  • FreeTourW
  • 2016年12月06日 21:25
  • 365

异质链表(C语言实现)

用C语言实现多态性的基本思想是使用void*指针,在存储链表结点值的时候将地址存入。   也就是说结点中存储的值并不是具体的值,而是一个地址,由于这个地址是main中的本地变量,所以不用担心它会被摧...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2015年11月11日 22:32
  • 4142

高质量外链的十大特性,怎么判断外链质量好不好

高质量外链的十大特性,怎么判断外链质量好不好     我们都晓得SEO排名优化诟谇常紧要的传广而告之法子,根蒂占有了广而告之的残山剩水。我们也晓得上网站内部链接是SEO优化最紧要身分之一,所以都...
  • lizhiww
  • lizhiww
  • 2017年07月21日 13:56
  • 211

java版的单向链表的基本操作

java版的单向链表的基本操作
  • xingzhemoluo
  • xingzhemoluo
  • 2014年11月06日 15:01
  • 854

用一个异质链表(多态性)保存学生数据

#include #include using namespace std; class Student { public: virtual void get()=0;...
  • wubin__
  • wubin__
  • 2015年06月02日 18:19
  • 147

用一个异质链表(多态性)保存学生数据

#include #include using namespace std; class Student { public: virtual void ge...
  • qingyu66
  • qingyu66
  • 2015年06月23日 18:56
  • 142

用一个异质链表(多态性)保存学生数据

#include #include using namespace std; class Student { public: virtual void get()=0; virtua...
  • sinat_24497029
  • sinat_24497029
  • 2015年05月27日 11:31
  • 237
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多态性的异质单向链
举报原因:
原因补充:

(最多只允许输入30个字)