zoukankan      html  css  js  c++  java
  • 异质链表

    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 }
  • 相关阅读:
    JAVA数据库连接池
    数据库连接池总结 Proxool
    Linux下挂载ISO文件
    Runtime.getRuntime().addShutdownHook()的使用
    tomcat original passports setting
    JDBC之通过DatabaseMetaData对象了解数据库的信息
    linux下mysql远程登陆
    教您如何安全的应用 MySQL
    Eclipse中cvs的使用介绍
    WM_COPYDATA
  • 原文地址:https://www.cnblogs.com/denggelin/p/5671560.html
Copyright © 2011-2022 走看看