多重表基础
多重表是《数据结构与算法分析:C语言描述》一书中给出的概念,书中给出了一张多重表示意图,如下所示:
从图中可以看出多重表是指一个节点有多个链穿过,和矩阵压缩存储中的十字链表十分相似。书中是以大学选课为例说明的,本处以书中例子为蓝本设计实现一种多重表。由于书中并没有给出具体的API,故本文主要根据自己的理解以及结合普通链表的API来编写ADT。本处主要实现如下几个功能:
- 多重表每条链长度
- 多重表插入、删除节点
- 多重表清空
根据图中示意,我们很容易想到表头统一采用数组来管理,每个链表内部保持有序便于插入删除。
多重表的定义与实现
根据书中多重表示意图,我们可以设计多重表的结构如下所示:
1 | struct MultiNode |
在实现多重表时,行和列分别定义一个哑节点数组,具体实现代码如下所示:
1 | class MultiTable |
如上所示,多重表主要是保存行数和列数以及对应的数组。以下分别实现个函数。
- 构造函数
1 | MultiTable::MultiTable(unsigned int row, unsigned int col) : rowSize(row), colSize(col), |
- 析构函数
1 | MultiTable::~MultiTable() |
- 清空函数
1 | void MultiTable::MakeEmpty() |
- 判断某行链表是否为空,如果行不存在也返回false,行从1开始
1 | bool MultiTable::IsRowEmpty(unsigned int rowIndex) |
- 判断某列链表是否为空,如果行不存在也返回false,列从1开始计算
1 | bool MultiTable::IsColEmpty(unsigned int colIndex) |
- 删除某行某列对应的节点,不存在就什么也不做,行列均从1开始
1 | void MultiTable::DeleteNode(unsigned int row, unsigned int col) |
- 在一行中插入节点,如果已存在就更新(本处啥也不做)
1 | void MultiTable::InsertNode(unsigned int row, unsigned int col) |
- 打印某一行(行不存在不做任何事)
1 | void MultiTable::PrintRowList(unsigned int rowIndex) |
- 打印某一行(列不存在不做任何事)
1 | void MultiTable::PrintColList(unsigned int colIndex) |
代码测试
就以书中图中为例,进行一些插入删除操作最后打印结果来检测代码是否正确,检测代码如下:
1 |
|