当前课程知识点:数据结构(上) > 第三章 列表 > (a)接口与实现 > 03A-4 实现
我们的列表结构
是由列表节点作为基本单位组成的
所以这里呢
我们首先要定义并且实现列表节点类
并且将它尽可能独立地封装起来
那么相应的呢
可以定义这样一系列的操作接口
我们来看看predecessor
取一个节点的前驱
以及successor 来取它的后继
以及常用的data 取其中的数据域
还有包括我们可能会将某个元素
作为当前这个节点的前驱或者后继
插入到它所属的那个列表中去
这样的一组ADT接口
如何用C++的语言来进行定义
实现并且封装呢?
我们来看一种可行的实现方法
首先定义一个名为
ListNode position的类型
虽然严格地来说 它还不是类型
好
接下来 定义ListNode这样一个类
这个类包括data一个数据域
以及predecessor和successor两个引用
以及正如刚才所说的那样
提供前驱插入和后继插入 两个操作接口
当然也包括构造函数
从逻辑上看
每一个节点都可以表示为这样的一个形式
中间是一个data
向前和向后分别有一个逻辑上的应用
在给出列表结构的具体实现之前
我们首先定义一组
它所应该提供的操作接口
仔细看会发现
它的接口的形式以及对应的功能
与我们在第二章中所学过的向量
也就是Vector结构颇为类似
我们这里就不花更多的时间逐一再展开
好在后边相应的各节
将对它们的功能和实现 再做详细的介绍
好 接下来我们就来看列表
也就是List这种模板类的具体定义
首先 我们要引入刚才所实现的列表节点类
接下来 我们可以看到
所谓的List这种模板类
也是分为三个层次
其中private 私有的层次 与向量类似
记录的都是那些对外不可见的部分
具体包括规模、引入两个哨兵节点
另外 也包括一些内部的功能函数
以及刚才我们所定义的
那些对外开放的标准的ADT接口
那么在这 我们只是给出了一个主体的框架
我们这里再强调一下
如果大家有兴趣
你愿意在这个电子版的讲义上
要进行阅读的话
那么保持你的电脑是连线的
接下来 只要点击这个或者是这个
就可以打开相应的源码 就像这样
在课堂上 我们都忽略掉一些细节
同样 因为后面还会逐一地介绍这些接口
而这里我们主要是要来领会
它的宏观的结构
这样的一个宏观结构
可以用下面这幅图来表示
我们可以看到 任何一个List结构
都会与生俱来地拥有一个叫作header
以及另一个叫作trailer的哨兵节点
header和trailer对外是不可见的
当然我们后面会看到 它们的作用非常巨大
而对外可见的部分呢
我们说主要是介乎header
和trailer之间的这样的一系列的元素
其中 如果存在的话
第一个元素 也就是firstNode
我们称作首元素
而最后一个last 我们称作末元素
那么相应的呢
我们也把这个名字规范一下
称header叫作头元素
我们称trailer是尾元素
尾巴的尾 尾元素
所以大家记清了头和首 末和尾
在至少我们这个课程中 讲的都是不同的
而且是确定的概念
那么它们之间的联系
可以在这里强调一下
头节点和尾节点是与生俱来的
而且二者并不相同
first和last并不见得不相同
甚至不能保证它们存在
但是对外而言first、last是可见的
而trailer和header
这两个哨兵都是invisible
也就是说 不可见的
当然从秩的角度来看
一个长度为n的列表中
头、首、末和尾这四个节点的秩
可以分别理解为
是等于-1、0、n-1以及n
如此定义的一个列表结构
可以按照这样的过程来创建
可以看到 首先要为header
和trailer分别地分配一个节点
使它们真实的存在
接下来 要将它们的后继以及前驱引用
分别指向对方
从而实现这样一个互联的效果
当然逻辑上看
这个时候 我们所谓对外可见的那个列表
实际上是没有任何元素的
对应的就是一个空列表
而在接下来的几节里 我们将会看到
我们可能会在其中插入一些元素
以及再插入一些元素
也可能时不常地从中删除
或者是修改某一个元素
总而言之
这个列表将有可能会包含
一些实在的、对外可见的节点
我们在后面再来看这些操作
是如何具体实现的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验