当前课程知识点:基于Linux的C++ >  第八讲 链表与程序抽象 >  8.5 链表(二) >  LinuxCPP0805

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP0805在线视频

LinuxCPP0805

下一节:LinuxCPP0806

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP0805课程教案、知识点、字幕

现在就使用数据封装与信息隐藏的

那个技术手段来设计抽象的链表库

首先我们来看抽象链表的接口

要想设计一个能够处理点的

数据类型抽象链表接口

就是“list.h”头文件

在设计它的时候就需要特别注意

一个 这个链表本身必须是抽象的

我要能够把它的数据封装起来

信息要能够藏起来

声明一个LIST这样一个结构体类型

“struct LIST;”

注意我们没有定义它的细节

我们把PLIST定义为指向struct LIST的指针类型

这就完成最基本的数据封装和信息隐藏

然后我们提供相应的接口

提供LlCreate、LlDestroy

完成这个链表的创建和销毁

然后提供LlAppend、LlInsert、LlDelete、LlClear

来完成链表结点的追加、插入、删除、清除

像这样的工作

我们提供LlTraverse、LlSearch

来完成这个链表的遍历与查找

这个就是抽象链表库的标准接口

接下来就是我们抽象链表库的基本实现

在这里要完成这些功能

链表的构造和删除、链表的追加、插入、删除、

遍历和查找这些最基本的功能

我们首先来看链表的构造与销毁

怎么实现这个链表构造与销毁呢

LlCreate这个函数里面

我们要动态地构造LIST类型的一个对象

我们用PLIST类型的一个指针变量p来保存

所构造出来的这个对象的地址

目标结构体的count域设为0

然后head和tail域都设成NULL

最后返回指针

然后LlDestroy 销毁

想销毁这个链表的时候 我们要注意

我们必须首先删除链表中所有的元素

然后才能销毁链表

因为我们这个链表里面包括一些

非常重要的数据结构

第一个 有一个struct LIST

LlDestroy这个函数 它的这个参数list

它实际上是一个指向struct LIST的指针

我们要销毁的就是那个struct LIST

目标数据对象

而这个目标数据对象有head指针和tail指针

尤其是head指针

它将指向我们的链表表头结点

而我们链表结点都是struct NODE

这样的一个数据对象

而这样的数据对象

又总是动态内存分配出来的

所以在我们销毁list所指向的

链表目标数据对象之前

必须保证这个链表中的所有结点

都已经被我们销毁了

如果你没有销毁链表中的全部的结点

你就销毁这个list

所指向的struct LIST那个目标结构体

那么这个链表中全部结点都会丢掉

这个做法是不对的

所以我们首先要调用一个函数

来完成链表结点的销毁

这个函数就是LlClear

LlClear这样一个函数要做的一个事情就是

必须一个接着一个地销毁链表中的所有结点

为了方便起见

总是从链表的表头结点开始删除

所以当链表的表头指针非空的时候

list->head这个链表的表头指针

一旦指向某一个确定的结点

而不是NULL的时候

就会设一个临时指针t

把它初始化成list->head

就是让它和表头指针指向同一个结点

也就是指向表头结点

然后list->head赋值为t->next

这样的话这个链表的表头指针

这个时候将不再指向原始的表头结点

而是指向原始表头结点的下一个结点

也就让下一个结点变成我们新的表头结点

而我们的t将使向原始的表头结点

对于我们的链表而言

因为链表中那个data字段

保存的是点的抽象数据

实际上保存是指向POINT那个二维点的指针

所以在你销毁t所指向的表头结点之前

必须调用PtDestroy(t->data)

销毁这个data字段所指向的

那个二维点的目标数据对象

此后整个链表的元素要递减

while循环 删除下一个表头

再循环 再删除表头

一直到链表的全部元素都被你删除

最后把链表的表尾结点设成NULL

这是我们的LlClear函数

因为保存是抽象的点的数据结构

所以在我们这个链表的头文件

也就是抽象链表库接口那个地方

我们必须包含“point.h”这个头文件

因为我们要用到PPOINT类型

而我们实现这个链表的时候

“list.cpp”也需要包含我们的“point.h”这个头文件

因为我们要使用PtDestroy

来销毁t->data所指向的目标二维点

也就是抽象链表库和抽象点库

两者是紧密关联的

你没有办法割裂这两者之间的关系

接下来就是表头结点的删除

我们可以为它画上这样一个图

那么对于表头结点删除动作的话

你已经看到我们的LlClrea函数的实现

那么我们怎么实现这个表头结点的删除呢

它实际上包含了最重要的几个步骤

第一步 我要需要设置一个临时指针t

也就是让它和head指向同样一个结点

指向这个表头结点

因为表头结点这个data域

将指向我们标准的二维点

所以你看到整个存储布局

我们的第一步

就需要让t指向我们的表头结点

我们的第二步

就要将链表的表头结点

从原始结点改变成原始结点的下一结点

head结点一改 原来表头结点

就从我们的这个链表中被抠出来了

不存在了

我们有临时指针t指向它

倒不担心内存泄露 但是链表本身

这个结点已经不存在了

接下来我们要销毁这个结点

在销毁这个结点之前你要记住

因为这个链表存储的是

二维点的一个数据结构

所以data字段

将指向二维点那个目标结构体

所以在销毁这个结点之前

第三步你要做的事情就是

首先你必须销毁二维点的数据结构

然后第四步

你才能够销毁我们的原始表头结点

t所指向的这个目标结点

第五步 我们要递减链表的结点数目

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP0805笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。