异型链表(每个节点中类型都不相同)案例如下:
#include "mainwindow.h"
#include <QApplication>
#include<QPushButton>
#include<QLabel>
//异型链表
class base
{
public:
virtual void show()=0;
};
class node
{
public:
base *p; //数据域
node *pNext;//指针域
};
void showall(node *phead)
{
while(phead!=NULL)
{
phead->p->show();
phead= phead->pNext;
}
}
node * add(node *phead, base *p)//改变一个指针需要二级指针,否则需要返回值并赋值
{
if(phead==NULL)
{
//phead=p;
node *px= new node;//开辟节点
px->pNext=NULL;//最后一个节点为空
px->p=p;//存储传过来的指针
phead =px;//连接
return phead;
}
else
{
node *pbak=phead;//保存头结点地址
while(phead->pNext!=NULL)//遍历到最后一个节点
{
phead=phead->pNext;
}
node *px= new node;//开辟就诶点
px->pNext=NULL;//最后一个节点为空
px->p=p;//存储传过来的指针
phead->pNext=px;//连接这个就诶点
return pbak;
}
}
class button:public base
{
public:
QPushButton w;
void show()
{
w.show();
}
};
class window:public base
{
public:
MainWindow w;
void show()
{
w.show();
}
};
class label:public base
{
public:
QLabel w;
void show()
{
w.show();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
node *phead=NULL;//指针必须初四化
button b1,b2,b3;
window w1,w2,w3;
label l1,l2,l3;
phead=add(phead,&b1);
phead=add(phead,&w1);
phead=add(phead,&l1);
showall(phead);
return a.exec();
}
int main2(int argc, char *argv[])
{
QApplication a(argc, argv);
node *phead;
button b1,b2,b3;
window w1,w2,w3;
label l1,l2,l3;
node node1,node2,node3,node4;
phead=&node1;
node1.pNext=&node2;
node2.pNext=&node3;
node3.pNext=&node4;
node4.pNext=NULL;//串联起来
node1.p=&b1;
node2.p=&w1;
node3.p=&l1;
node4.p=&b2;
showall(phead);
return a.exec();
}