程序设计基础教程第11章 数据结构和数据抽象
合集下载
数据结构(C++版)(第二版) 第11章
![数据结构(C++版)(第二版) 第11章](https://img.taocdn.com/s3/m/ba75eb1e5a8102d276a22f45.png)
2019年3月9日
5
索引表是有序表,可以用快速的折半查找来实现,而主文件为索引顺序文件时, 也可以用折半查找实现,主文件为索引非顺序文件时,只能用顺序查找来实现。 当一个文件很大时,索引表也很大,这时可以对索引表再建立一个索引,称为 二级索引。更大的索引表可以建立多级索引。
在图11-1中,(a)为主表,(b)为一级索引表,(c)为二级索引表。
2019年3月9日
8
在ISAM文件上检索记录时,先从主索引出发找到相应的柱面索引,再从柱面索引 找到记录所在柱面的磁道索引,最后从磁道索引找到记录所在磁道的第一个记录 的位置,由此出发在该磁道上进行顺序查找直到找到为止;反之,若找遍该磁道 而不存在此记录,则表明该文件中无此记录。
例如,在图11-2中,查找关键字21时,先找到主索引中620,再找到柱面索引164, 最后找到磁道索引50,最后顺序查找到R21,查找成功。若查找关键字48,先找 到主索引中620,再找到柱面索引164,最后找到磁道索引50,最后顺序查找到 R50,无R48,查找不成功。
顺序文件是根据记录的序号或记录的相对位置进行存取的文件组织方式。它的 特点是: (1) 存取第K个记录必须先搜索在它之前的K-1个记录。 (2) 插入新的记录时只能在文件末尾插入。 (3) 若要更新文件中的某个记录,则必须将该文件复制。
由于顺序文件的优点是连续存取速度快,因此主要用于顺序存取、批量修改的 情况。 磁带是一种典型的顺序存取设备,存储在磁带上的文件就是顺序文件。但磁带 目前很 少使用,使用的顺序文件多为磁盘顺序文件。对顺序文件可以向顺序表一样, 进行顺序查找、分块查找或折半查找(文件有序)。
第11章 文件
本章学习内容 11.1 文件的基本概念 11.2 顺序文件 11.3 索引文件 11.4 ISAM文件和VSAM文件
第11章程序设计基础
![第11章程序设计基础](https://img.taocdn.com/s3/m/3d761d7e84254b35effd3422.png)
题
返
面向数据的方法
回
目 1.面向过程的方法
的
面向过程的方法又称为结构化方法。它包括
要
点
面向过程需求分析、面向过程设计、面向过程编
重 点
程、面向过程测试、面向过程维护和面向过程管
习
理,习惯上称为结构化分析、结构化设计、结构
题
化编程、结构化测试和结构化维护。
返
回
目 2.面向对象的方法
的
要
点
面向对象的方法包括面向对象需求分析、面
题
设计和编码的最终检查,是发现软件中错误和缺
返
回
陷的主要手段。一般情况下,软件测试过程与整
个软件开发过程基本上是平行进行的。
目 的
要 1.软件测试的目的
点
重 2.软件测试的原则
点
习 3.软件测试的方法
题
4.软件测试过程
返 回
目 的
11.2.5 软件维护
要
软件维护是指在软件已经交付使用之后(即
重 点
描述,或者说算法是解决一个问题而采取的方法和
习 步骤。如上网的过程是:打开浏览器的窗口、输入 题 网址、在网页上操作、关闭网页,这就是“上网算
返
回 法”。
目 11.3.2算法的特征
的
要 一个好的算法应该具有以下几个特性:
点
1.正确性
重
点 2.可读性
习 题
3.准确性
返 4.高效率和低存储量
要 1.软件
点
软件是计算机系统必不可少的组成部分,
重 点
是程序、数据和相关文档的集合。其中程序
是软件开发人员根据用户需求开发的、用程
习
c++编程课件第11章
![c++编程课件第11章](https://img.taocdn.com/s3/m/bd9acbe7551810a6f52486a7.png)
//打开文件,使流对象与文件建立联系
可以使用同一个流先后打开不同的文件!(P483) 有打开就有关闭!关闭后可再次使用(P489)
插入运算符(<<)
输 出 流
插入(<<)运算符是所有标准C++数据类型 预先设计的。 用于传送字节到一个输出流对象。
– cout<<…… – ofstream f1(‚file1.txt‛[,ios_base::out]); – f1<<……
例11.9(改) 从文件读二进制记录
输 入 流
程序: 运行:
例11.10 设置位置指针
输 入 流
程序: 运行: 操作注意:
– 配合11-9看 – 注意当前位置
例11.11 读文件
输 入 流
程序: 运行:
– 例一配合11-9看 – 位置坐标从0开始
例3 读写文件
习题11-3~5
控制输出格式
输 出 流
头文件<iomanip> P38表2-6 通过操纵符和函数控制格式
–对象名.函数名(): cout.fill() –对象名<<操纵符(): cout<<setw();
以cout为例, 其他输出流对 象皆可
控制输出宽度
–为了调整输出,可以通过在流中放入setw操纵符 或调用width成员函数为每个项指定输出宽度。
输出流
输 出 流
最重要的三个输出流是
– ostream – ofstream:#include <fstream>; – ostringstream
可以使用同一个流先后打开不同的文件!(P483) 有打开就有关闭!关闭后可再次使用(P489)
插入运算符(<<)
输 出 流
插入(<<)运算符是所有标准C++数据类型 预先设计的。 用于传送字节到一个输出流对象。
– cout<<…… – ofstream f1(‚file1.txt‛[,ios_base::out]); – f1<<……
例11.9(改) 从文件读二进制记录
输 入 流
程序: 运行:
例11.10 设置位置指针
输 入 流
程序: 运行: 操作注意:
– 配合11-9看 – 注意当前位置
例11.11 读文件
输 入 流
程序: 运行:
– 例一配合11-9看 – 位置坐标从0开始
例3 读写文件
习题11-3~5
控制输出格式
输 出 流
头文件<iomanip> P38表2-6 通过操纵符和函数控制格式
–对象名.函数名(): cout.fill() –对象名<<操纵符(): cout<<setw();
以cout为例, 其他输出流对 象皆可
控制输出宽度
–为了调整输出,可以通过在流中放入setw操纵符 或调用width成员函数为每个项指定输出宽度。
输出流
输 出 流
最重要的三个输出流是
– ostream – ofstream:#include <fstream>; – ostringstream
C++语言程序设计第11章
![C++语言程序设计第11章](https://img.taocdn.com/s3/m/77de71d343323968001c920e.png)
最
升
38888
大
的
初第 第 第 第
始一 二 三 四
状趟 趟 趟 趟
态结 结 结 结
果 果果果
12
起泡排序函数模板
例10.3(10-3.h)
13
小结
排序的基本思想; 冒泡排序;
14
7
选择排序的基本思想
每次从待排序序列中选择一个关键字最小的元素, (当需要按关键字升序排列时),顺序排在已排序序列的 最后,直至全部排完。
初始状态:
[5 4 10 20 12 3]
3 [4 10 20 12 5]
3 4 [10 20 12 5]
3
4
5 [20 12 10]
... ...
第 i 次选择后,将选出的那个记录与第 i 个记录做交换。 8
5 10] 20 12 3 5 10 20] 12 3 5 10 12 20] 3
5 [3] [3
4
5 10 12 20]
6
直接插入排序
在插入排序过程中,由于寻找插入位置 的方法不同又可以分为不同的插入排序 法,这里我们只介绍最简单的直接插入 排序法。
例10.1 直接插入排序函数模板(10-1.h)
在排序过程中需要完成两种基本操作: 比较两个数的大小 调整元素在数组中的位置
3
内部排序与外部排序
内部排序:待排序的数据元素存放在计 算机内存中进行的排序过程。
外部排序:待排序的数据元素数量很大, 以致内存存中一次不能容纳全部数据, 在排序过程中尚需对外存进行访问的排 序过程。
4
内部排序方法
C++语言程序设计
第十一章 群体数据的组织
本章主要内容
第11章 继承与派生《C++程序设计基础教程》课件
![第11章 继承与派生《C++程序设计基础教程》课件](https://img.taocdn.com/s3/m/acf3b56665ce05087732135e.png)
继承 调整 新增
8
11.2 派生类的构成
9
继承方式影响基类成员在派生类的访问属性
(1) 公用继承(public inheritance) 基类的公用和保护成员在派生类中保持原有访问 属性,私有成员仍为基类私有(不可访问)。
(2) 私有继承(private inheritance) 基类的公用和保护成员在派生类中成了私有成员, 私有成员仍为基类私有(不可访问) 。
(3) 受保护的继承(protected inheritance) 基类的公用和保护成员在派生类中成了保护成员, 私有成员仍为基类私有(不可访问) 。
9
11.2 派生类的构成
10
class A{ int x;
}; class B: A{ public:
void F(){ x = 1;
} };
基类的所有成员(构 造函数和析构函数除 外)都由派生类型继 承,甚至包括基类的 私有成员。但是,私 有成员的可访问域只 包括声明该成员的类 型的程序文本。
21
例11.5 析构函数的调用顺序举例22ຫໍສະໝຸດ class A{ int a;
public: A(int x):a(x) { //基类A的构造函数 cout << "construct A " << a << endl; } ~A() { //基类A的析构函数 cout << "destruct A " << a << endl; }
public:
void GetScore()
void Display()
private:
float score
C 语言程序设计章 (11)
![C 语言程序设计章 (11)](https://img.taocdn.com/s3/m/cb8110ec0912a216157929b2.png)
{
MyStack<int,5> ss;
for(int i=0;i<10;i++)
{try
{if(i%3)cout<<ss.pop()<<endl;
else ss.push(i);
}
catch (StackOverflowException &e)
{ e.getMessage();
}
catch (StackEmptyException &e)
– try语句块和catch语句块是一个整体,两者之间不能有其他的语句;
– 一个try语句块后面可以有多个catch语句,但是,不可以几个try语句块后 面用一个catch语句。
C++语言程序设计
11
11.3 用类对象传递异常
– throw语句所传递的异常,可以是各种类型的:整型、实型、字符型、指针, 等等。也可以用类对象来传递异常。
template <class T, int i> //类模板定义 class MyStack { T StackBuffer[i];
int size; int top; public: MyStack( void ) : size( i ) {top = i;}; void push( const T item ); T pop( void ); };
理的机制。
C++语言程序设计
6
• 例:程序将连续地输入两个实数,通过调用函数,返回这两个数相除的商。并且 要注意除数不能为0。
• 用一般的方法处理除法溢出
void main()
#include <iostream>
Ch11 数据结构与算法基础
![Ch11 数据结构与算法基础](https://img.taocdn.com/s3/m/604c38a60d22590102020740be1e650e52eacfe3.png)
• (1)访问节点本身(N)。 • (2)遍历该节点的左子树(L)。 • (3)遍历该节点的右子树(R)
• 以上三种操作有六种遍历方法:NLR、LNR、LRN、NRL、RNL、RLN
二叉树的遍历(2)
• 1、NLR:前序遍历(Preorder Traversal),又称为先序遍历。若二叉树非空,则依次执 行如下操作。
机中的表示。其具体的实现方法包括顺序、链接、索引、散列等多种形式。一种数据结 构可以由一种或者多种物理存储结构实现 • (3)数据的运算结构 • 数据的运算结构反映在数据的逻辑结构上定义的操作算法,例如检索、插入、删除、更 新和排序等
数据的逻辑结构(1)
• 反映数据元素之间的逻辑关系,与他们在计算机中的存储位置无关
• 树的常用术语(1)
• (1)节点:每个元素称为节点。 • (2)根节点:没有父节点的节点称为根节点。 • (3)节点的度(degree):一个节点含有的子节点个数称为该节点的度。 • (4)叶节点或终端节点(leaf):度为0的节点称为叶节点。 • (5)非终端节点或分支节点(branch):度不为0的节点。
• 遍历左子树(L) • 遍历右子树(R) • 访问根结点(N)
图、堆、散列表
• 图(Graph)是另一种非线性数据结构。图是由顶点集合V(Vertex )和边集合E(Edge)组成的,定义为G=(V,E)
• 在图结构中,数据节点一般称为顶点,而边是顶点的有序偶对。如果 两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系
棵二叉树为满二叉树。即,一棵深度为k且有2k-1个结点的二叉树称为满二叉树。满二叉树每一层的结点 个数都达到了最大值,即满二叉树的第i层上有2i-1个结点。如图5-6(a)所示是一棵深度为3的满二叉树 • (21)完全二叉树:满二叉树中叶子节点所在的层次中,如果自右向左连续缺少若干叶子节点,这样的得 到的二叉树被称为完全二叉树。即,若设二叉树的深度为k,除第k层外,其它各层(1~k-1)的节点数 都达到最大个数,而第k层所有的节点都连续集中在最左边,这就是一个完全二叉树。如图5-6(b)所示 是一棵完全二叉树。如图5-6(c)所示是一棵非完全二叉树。满二叉树是完全二叉树的特殊形态。 • (22)哈夫曼树(最优二叉树):带权路径最短的二叉树称为哈夫曼树或最优二叉树
• 以上三种操作有六种遍历方法:NLR、LNR、LRN、NRL、RNL、RLN
二叉树的遍历(2)
• 1、NLR:前序遍历(Preorder Traversal),又称为先序遍历。若二叉树非空,则依次执 行如下操作。
机中的表示。其具体的实现方法包括顺序、链接、索引、散列等多种形式。一种数据结 构可以由一种或者多种物理存储结构实现 • (3)数据的运算结构 • 数据的运算结构反映在数据的逻辑结构上定义的操作算法,例如检索、插入、删除、更 新和排序等
数据的逻辑结构(1)
• 反映数据元素之间的逻辑关系,与他们在计算机中的存储位置无关
• 树的常用术语(1)
• (1)节点:每个元素称为节点。 • (2)根节点:没有父节点的节点称为根节点。 • (3)节点的度(degree):一个节点含有的子节点个数称为该节点的度。 • (4)叶节点或终端节点(leaf):度为0的节点称为叶节点。 • (5)非终端节点或分支节点(branch):度不为0的节点。
• 遍历左子树(L) • 遍历右子树(R) • 访问根结点(N)
图、堆、散列表
• 图(Graph)是另一种非线性数据结构。图是由顶点集合V(Vertex )和边集合E(Edge)组成的,定义为G=(V,E)
• 在图结构中,数据节点一般称为顶点,而边是顶点的有序偶对。如果 两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系
棵二叉树为满二叉树。即,一棵深度为k且有2k-1个结点的二叉树称为满二叉树。满二叉树每一层的结点 个数都达到了最大值,即满二叉树的第i层上有2i-1个结点。如图5-6(a)所示是一棵深度为3的满二叉树 • (21)完全二叉树:满二叉树中叶子节点所在的层次中,如果自右向左连续缺少若干叶子节点,这样的得 到的二叉树被称为完全二叉树。即,若设二叉树的深度为k,除第k层外,其它各层(1~k-1)的节点数 都达到最大个数,而第k层所有的节点都连续集中在最左边,这就是一个完全二叉树。如图5-6(b)所示 是一棵完全二叉树。如图5-6(c)所示是一棵非完全二叉树。满二叉树是完全二叉树的特殊形态。 • (22)哈夫曼树(最优二叉树):带权路径最短的二叉树称为哈夫曼树或最优二叉树
数据结构与抽象数据类型PPT培训课件
![数据结构与抽象数据类型PPT培训课件](https://img.taocdn.com/s3/m/81f9c1a0312b3169a551a42a.png)
算法 + 数据结构
• 线性表(栈、队列):链表、倒排表、 表。
• 二叉树(堆):排序树、优先队列、表 达式树、 树
• 树(索引):深搜、广搜 • 图(有向、无向、加权): ,最短路
径、关键路径
算法与算法复杂度
• 分治:快速排序 • 贪心:
– 动态规划(分阶段贪心):背包问题
• 搜索(回溯) 迷宫老鼠
初步设计思路
改进的程序思路
进一步改进
抽象数据类型(ADT)
Queue
InQueue DeQueue
IsEmpty
对外操作接口 结构数据维护接口
…
数据结构的具体实现
First Come First Service(queue)
算法与数据结构
VS 计算概论
35. 最终审查
31.5 评标委员会将确定每份投标文件是否完整以及是否对招标文件的要求作出了实质性的响应,没有重大偏离或保留。重大偏离或保
要实事求是,严禁弄虚作假;
算法求解思路的类型化 第十条 条若企业团组织设置发生变化,企业团委直属的团组织可按照分级管理的原则,参照本办法在本级组织内开展竞争上岗工作。
2.演练的目的
1、推荐优秀青年人才上岗工作要积极争取党委的领导和有关部门的配合,每年至少向党委汇报一次;
函数 VS 抽象数据类型
• 函数 • 抽象数据类型 • 数据及运算、对象及服务 • 基于服务的服务 • 软件
严为格了按 提照升招效标率与文品件质的,要许求多和工条厂件进不行断。引“进公高平性、 能公的正设、备择与优系、统效,益但”作为业现本场次依评然标事的故基频本频原。则究,其评原标因委,员绝会大将我按数照是这人一为原失则误的,要如求错,误公 正操、作平 、等作地业对条待件各未投确标认人等。到同。时如,果在5S评活标动时不恪好守的以话下,原常则常:是操作盘及仪表脏污,导致数字读错、模具安装失误等行为发生。此种因人 2为.公疏布忽张的贴事在故工必作须现以场彻﹐底与的其5S放活在动桌来子消抽灭屉。内是不同的。不管你喜不喜欢﹐你每天都要看到它﹐因此会产生必须改善的心理。
《数据结构(C版)(第二版)》第11章.
![《数据结构(C版)(第二版)》第11章.](https://img.taocdn.com/s3/m/36569d14bb68a98271fefacc.png)
第11章 文件
本章学习内容 11.1 文件的基本概念 11.2 顺序文件 11.3 索引文件 11.4 ISAM文件和VSAM文件
11.5 散列文件
11.6 多关键字文件
2018年9月24日
1
11.1 文件的基本概念
文件是由大量性质相同的记录所构成的集合。 文件有不同的分类方式: 按记录类型分:操作系统文件和数据库文件。 按记录是否定长分:定长记录文件和不定长记录文件。 按查找关键字多少分:单关键文件和多关键文件。 记录有逻辑结构和存储结构之分。记录的逻辑结构,是指记录在用户或应用程 序员面前呈现的方式,是用户对数据的表示和存取方式。记录的存储结构是指 数据在物理存储器中的存储形式,是数据的物理表示和组织。
2018年9月24日
2
文件和数据元素一样,也有逻辑结构和存储结构。文件的逻辑结构可以表现为 记录的逻辑结构。文件的存储结构是指文件在物理存储器(磁盘或磁带)中的 组织方式。文件可以有各种各样的组织方式,其基本方式有三种:顺序组织、 随机组织和链组织。 对文件所施加的运算(操作)有两类:查找(检索)和更新(修改)。 文件的查找(检索)有三种方式:顺序查找、按记录号直接随机查找、按关键 字直接随机查找。
磁道索引 r47 384 3 4150 溢出区
图11-2 ISAM文件结构
2018年9月24日
10
从图11-2可以看到,每个柱面上还开辟有一个溢出区,这是为插入记录所设 置的。由于ISAM文件中记录是按关键字顺序存放的,则在插入记录时需移动 记录并将同一磁道上最末一个记录移到溢出区,同时修改磁道索引项。通常 在文件中可集中设置一个溢出区,或在每个柱面分别设置一个溢出区,或在 柱面溢出区满后再使用公共溢出区。引 330
磁道索引 50 164
本章学习内容 11.1 文件的基本概念 11.2 顺序文件 11.3 索引文件 11.4 ISAM文件和VSAM文件
11.5 散列文件
11.6 多关键字文件
2018年9月24日
1
11.1 文件的基本概念
文件是由大量性质相同的记录所构成的集合。 文件有不同的分类方式: 按记录类型分:操作系统文件和数据库文件。 按记录是否定长分:定长记录文件和不定长记录文件。 按查找关键字多少分:单关键文件和多关键文件。 记录有逻辑结构和存储结构之分。记录的逻辑结构,是指记录在用户或应用程 序员面前呈现的方式,是用户对数据的表示和存取方式。记录的存储结构是指 数据在物理存储器中的存储形式,是数据的物理表示和组织。
2018年9月24日
2
文件和数据元素一样,也有逻辑结构和存储结构。文件的逻辑结构可以表现为 记录的逻辑结构。文件的存储结构是指文件在物理存储器(磁盘或磁带)中的 组织方式。文件可以有各种各样的组织方式,其基本方式有三种:顺序组织、 随机组织和链组织。 对文件所施加的运算(操作)有两类:查找(检索)和更新(修改)。 文件的查找(检索)有三种方式:顺序查找、按记录号直接随机查找、按关键 字直接随机查找。
磁道索引 r47 384 3 4150 溢出区
图11-2 ISAM文件结构
2018年9月24日
10
从图11-2可以看到,每个柱面上还开辟有一个溢出区,这是为插入记录所设 置的。由于ISAM文件中记录是按关键字顺序存放的,则在插入记录时需移动 记录并将同一磁道上最末一个记录移到溢出区,同时修改磁道索引项。通常 在文件中可集中设置一个溢出区,或在每个柱面分别设置一个溢出区,或在 柱面溢出区满后再使用公共溢出区。引 330
磁道索引 50 164
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第
十一
章
数据结构和数据抽象
2017/7/30
程序设计基础(C语言)wh
1
本章内容
11.1 数据抽象
11.2 线性表 11.3 堆栈 11.4 队列 小结
2017/7/30
程序设计基础(C语言)wh
2
11.1 数据抽象
11.1.1 数据结构和数据类型
数据结构用来反映数据的内部构成 ,有逻辑上的数据结 构和物理上的数据结构之分 。
2017/7/30 程序设计基础(C语言)wh 6
11.2.3 线性表的顺序存储
从结构上考虑,通常线性表的存储类型可以描述如下: typedef struct
{elemtype data[MAXSIZE];
int length; } SeqList; 定义一个顺序表:SeqList L;,有时定义一个指向SeqList类 型的指针更为方便:SeqList *L;
判断栈是否为空:StackEmpty(S) 。
判断栈是否为满:StackFull(S) 。 出栈:Pop(&S, &x) 。
பைடு நூலகம்
2017/7/30
程序设计基础(C语言)wh
5
11.2.2 线性表的基本操作 线性表上的基本操作有: (1) 线性表初始化:InitList(&L) (2) 求线性表的长度:ListLength (L) (3) 求线性表中某个数据元素值:GetElem(L,i,&x) (4) 按元素值查找:LocateElem(L,x) (5) 插入操作:InsertList(&L,i,x) (6) 删除操作:DeleteList(&L,i,&x) 说明: (1) 某数据结构上的基本运算,不是它的全部运算,而是一些常 用的基本的运算,而每一个基本运算在实现时也可能根据不同 的存储结构派生出一系列相关的运算来。 (2) 在上面各操作中定义的线性表L仅仅是一个抽象在逻辑结构 层次的线性表,尚未涉及到它的存储结构,因此每个操作在逻 辑结构层次上尚不能用具体的某种程序语言写出具体的算法。
L=(SeqList *)malloc(sizeof(SeqList));
L->length=0; return L; }
2017/7/30
程序设计基础(C语言)wh
8
【算法11.2】插入 int Insert_SeqList(SeqList *L,int I,elemtype x) { int j ; if(i<1||i>L->length+1) return(0) ; /*检查插入位置的正确性*/ for(j=L->length;j>=i;j--) L->data[j]=L->data[j-1] ; /*向后移动*/ L->data[i]=x ; /*新元素插入*/ L->length++ ; /*顺序表长度增加1*/ return (1) ; /*插入成功,返回*/ }
2017/7/30
程序设计基础(C语言)wh
10
【算法11.4】按值查找 int Location_SeqList(SeqList *L, elemtype x) { int i=0; while(i< L->length && L->data[i]!= x) i++; if (i>=L->length) return 0; else return i+1; /*返回该元素的位序*/ }
2017/7/30
程序设计基础(C语言)wh
9
【算法11.3】删除 int Delete_SeqList(SeqList *L,int i) { int j; if(i<1||i>L->length) /*检查空表及删除位置的合法性*/ return(0); for(j=i;j<=L->length-1;j++) L->data[j-1]=L->data[j]; /*向前移动*/ L->length--; /*顺序表长度减1*/ return(1); }
2017/7/30
程序设计基础(C语言)wh
11
11.3 堆栈
11.3.1 抽象栈的定义及基本操作
堆栈(也称为栈,stack)是一个线性表,其插入(也称 为添加)和删除操作都在表的同一端进行。其中允许插入和删 除的一端称为栈顶(top),另一端称为栈底(bottom)。 抽象堆栈类型的操作: 构造空栈:InitStack(&S)。
程序设计基础(C语言)wh
3
11.1.2 抽象数据类型
抽象数据类型(abstract data type, ADT)是用户进行软件设 计时,从问题的数学模型中抽象出来的逻辑数据结构和逻辑数 据结构上的一组操作,而不考虑计算机的具体存储结构和操作 的具体实现算法。
抽象数据类型可用(D, S, P)三元组表示。其中,D是数据 对象;S是D上的关系集;P是D中数据运算的基本运算集。其 基本格式如下: ADT 抽象数据类型名 { 数据对象:<数据对象的定义> 数据关系:<数据关系的定义> 基本运算:<基本运算的定义> } ADT抽象数据类型名
2017/7/30 程序设计基础(C语言)wh 4
11.2 线性表
11.2.1 线性表的定义
线性表是具有相同特性的n(n≥0)个数据元素的有限序列, 通常记为:(a1,a2,… ai-1,ai,ai+1,… an)
其中n为表长,n=0时称为空表。
特点: 均匀性:同一线性表的各数据元素必定有相同的数据类型 和长度。 有序性:有唯一的“第一个”和“最后一个”元素,每个 元素只有一个直接前趋和一个直接后续。
L是一个指针变量,指向SeqList类型的数据,线性表的存 储空间通过如下语句获得:
L=(SeqList *)malloc(sizeof(SeqList));
2017/7/30
程序设计基础(C语言)wh
7
11.2.4 顺序表上基本运算的实现
【算法11.1】顺序表的初始化 SeqList *Init_SeqList( ) { SeqList *L;
数据类型是一个值的集合和定义在此集合上的一组操作 的总称。
数据结构是指计算机处理的数据元素的组织形式和相互 关系,数据类型是某种程序设计语言中已实现的数据结构。 在程序设计语言提供的数据类型支持下,可以根据从问题中 抽象出来的各种数据模型,逐步构造出描述这些数据模型的 各种新的数据结构。
2017/7/30
十一
章
数据结构和数据抽象
2017/7/30
程序设计基础(C语言)wh
1
本章内容
11.1 数据抽象
11.2 线性表 11.3 堆栈 11.4 队列 小结
2017/7/30
程序设计基础(C语言)wh
2
11.1 数据抽象
11.1.1 数据结构和数据类型
数据结构用来反映数据的内部构成 ,有逻辑上的数据结 构和物理上的数据结构之分 。
2017/7/30 程序设计基础(C语言)wh 6
11.2.3 线性表的顺序存储
从结构上考虑,通常线性表的存储类型可以描述如下: typedef struct
{elemtype data[MAXSIZE];
int length; } SeqList; 定义一个顺序表:SeqList L;,有时定义一个指向SeqList类 型的指针更为方便:SeqList *L;
判断栈是否为空:StackEmpty(S) 。
判断栈是否为满:StackFull(S) 。 出栈:Pop(&S, &x) 。
பைடு நூலகம்
2017/7/30
程序设计基础(C语言)wh
5
11.2.2 线性表的基本操作 线性表上的基本操作有: (1) 线性表初始化:InitList(&L) (2) 求线性表的长度:ListLength (L) (3) 求线性表中某个数据元素值:GetElem(L,i,&x) (4) 按元素值查找:LocateElem(L,x) (5) 插入操作:InsertList(&L,i,x) (6) 删除操作:DeleteList(&L,i,&x) 说明: (1) 某数据结构上的基本运算,不是它的全部运算,而是一些常 用的基本的运算,而每一个基本运算在实现时也可能根据不同 的存储结构派生出一系列相关的运算来。 (2) 在上面各操作中定义的线性表L仅仅是一个抽象在逻辑结构 层次的线性表,尚未涉及到它的存储结构,因此每个操作在逻 辑结构层次上尚不能用具体的某种程序语言写出具体的算法。
L=(SeqList *)malloc(sizeof(SeqList));
L->length=0; return L; }
2017/7/30
程序设计基础(C语言)wh
8
【算法11.2】插入 int Insert_SeqList(SeqList *L,int I,elemtype x) { int j ; if(i<1||i>L->length+1) return(0) ; /*检查插入位置的正确性*/ for(j=L->length;j>=i;j--) L->data[j]=L->data[j-1] ; /*向后移动*/ L->data[i]=x ; /*新元素插入*/ L->length++ ; /*顺序表长度增加1*/ return (1) ; /*插入成功,返回*/ }
2017/7/30
程序设计基础(C语言)wh
10
【算法11.4】按值查找 int Location_SeqList(SeqList *L, elemtype x) { int i=0; while(i< L->length && L->data[i]!= x) i++; if (i>=L->length) return 0; else return i+1; /*返回该元素的位序*/ }
2017/7/30
程序设计基础(C语言)wh
9
【算法11.3】删除 int Delete_SeqList(SeqList *L,int i) { int j; if(i<1||i>L->length) /*检查空表及删除位置的合法性*/ return(0); for(j=i;j<=L->length-1;j++) L->data[j-1]=L->data[j]; /*向前移动*/ L->length--; /*顺序表长度减1*/ return(1); }
2017/7/30
程序设计基础(C语言)wh
11
11.3 堆栈
11.3.1 抽象栈的定义及基本操作
堆栈(也称为栈,stack)是一个线性表,其插入(也称 为添加)和删除操作都在表的同一端进行。其中允许插入和删 除的一端称为栈顶(top),另一端称为栈底(bottom)。 抽象堆栈类型的操作: 构造空栈:InitStack(&S)。
程序设计基础(C语言)wh
3
11.1.2 抽象数据类型
抽象数据类型(abstract data type, ADT)是用户进行软件设 计时,从问题的数学模型中抽象出来的逻辑数据结构和逻辑数 据结构上的一组操作,而不考虑计算机的具体存储结构和操作 的具体实现算法。
抽象数据类型可用(D, S, P)三元组表示。其中,D是数据 对象;S是D上的关系集;P是D中数据运算的基本运算集。其 基本格式如下: ADT 抽象数据类型名 { 数据对象:<数据对象的定义> 数据关系:<数据关系的定义> 基本运算:<基本运算的定义> } ADT抽象数据类型名
2017/7/30 程序设计基础(C语言)wh 4
11.2 线性表
11.2.1 线性表的定义
线性表是具有相同特性的n(n≥0)个数据元素的有限序列, 通常记为:(a1,a2,… ai-1,ai,ai+1,… an)
其中n为表长,n=0时称为空表。
特点: 均匀性:同一线性表的各数据元素必定有相同的数据类型 和长度。 有序性:有唯一的“第一个”和“最后一个”元素,每个 元素只有一个直接前趋和一个直接后续。
L是一个指针变量,指向SeqList类型的数据,线性表的存 储空间通过如下语句获得:
L=(SeqList *)malloc(sizeof(SeqList));
2017/7/30
程序设计基础(C语言)wh
7
11.2.4 顺序表上基本运算的实现
【算法11.1】顺序表的初始化 SeqList *Init_SeqList( ) { SeqList *L;
数据类型是一个值的集合和定义在此集合上的一组操作 的总称。
数据结构是指计算机处理的数据元素的组织形式和相互 关系,数据类型是某种程序设计语言中已实现的数据结构。 在程序设计语言提供的数据类型支持下,可以根据从问题中 抽象出来的各种数据模型,逐步构造出描述这些数据模型的 各种新的数据结构。
2017/7/30