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 }