异质链表

8.5.2异质链表

程序中,用基类类型指针,可以生成一个连接不同派生类对象的动态链表,即每个结点指针可以指向类层次中不同的派生类对象。

这种结点类型不相同链表称为异质链表。

比如:任务管理器,使用异质链表实现。

使用QT,建立一个异质链表,使其可以存储多个类的对象,包括Dialog,QLabel,QPushButton

  1 #include "mainwindow.h"
  2 #include <QApplication>
  3 #include<QPushButton>
  4 #include<QLabel>
  5 
  6 class base//基类
  7 {
  8 public:
  9     virtual  void  show()=0;
 10 };
 11 
 12 class node//链表结点
 13 {
 14  public:
 15       base *p;       //数据域
 16       node *pNext;//指针域
 17 };
 18 
 19 void showall(node *phead)//打印链表
 20 {
 21     while(phead!=NULL)
 22     {
 23 
 24        phead->p->show();
 25        phead= phead->pNext;
 26     }
 27 }
 28 
 29 node * add(node *phead, base *p)//改变一个指针需要二级指针,否则需要返回值并赋值
 30 {
 31     if(phead==NULL)
 32     {
 33         //phead=p;
 34         node *px= new node;//开辟节点
 35         px->pNext=NULL;//最后一个节点为空
 36         px->p=p;//存储传过来的指针
 37 
 38         phead =px;//连接
 39 
 40         return phead;
 41 
 42     }
 43     else
 44     {
 45         node *pbak=phead;//保存头结点地址
 46         while(phead->pNext!=NULL)//遍历到最后一个节点
 47         {
 48 
 49            phead=phead->pNext;
 50         }
 51         node *px= new node;//开辟就诶点
 52         px->pNext=NULL;//最后一个节点为空
 53         px->p=p;//存储传过来的指针
 54 
 55         phead->pNext=px;//连接这个就诶点
 56 
 57         return pbak;
 58     }
 59 }
 60 
 61 class button:public base//QPushButton
 62 {
 63 public:
 64     QPushButton w;
 65     void show()
 66     {
 67         w.show();
 68     }
 69 };
 70 
 71 class window:public base//MainWindow
 72 {
 73 public:
 74     MainWindow  w;
 75     void show()
 76     {
 77         w.show();
 78     }
 79 };
 80 
 81 class  label:public base
 82 {
 83 public:
 84     QLabel  w;
 85     void show()
 86     {
 87         w.show();
 88     }
 89 };
 90 
 91 int main(int argc, char *argv[])
 92 {
 93     QApplication a(argc, argv);
 94     
 95     node *phead=NULL;//指针必须初始化,避免野指针
 96     button b1,b2,b3;
 97     window w1,w2,w3;
 98     label l1,l2,l3;
 99 
100     phead=add(phead,&b1);//插入结点
101     phead=add(phead,&w1);
102     phead=add(phead,&l1);
103 
104     showall(phead);//打印链表
105 
106     return a.exec();
107 }
108 
109 int main2(int argc, char *argv[])
110 {
111     QApplication a(argc, argv);
112     node *phead;
113     button b1,b2,b3;
114     window w1,w2,w3;
115     label l1,l2,l3;
116 
117     node node1,node2,node3,node4;
118     phead=&node1;
119     node1.pNext=&node2;
120     node2.pNext=&node3;
121     node3.pNext=&node4;
122     node4.pNext=NULL;//串联起来
123     node1.p=&b1;
124     node2.p=&w1;
125     node3.p=&l1;
126     node4.p=&b2;
127 
128 
129     showall(phead);
130 
131 
132 
133 
134     return a.exec();
135 }
原文地址:https://www.cnblogs.com/denggelin/p/5671560.html