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 }
  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/denggelin/p/5671560.html
Copyright © 2011-2022 走看看