抽象数据类型
抽象数据类型在C语言中的实现

抽象数据类型在C语言中的实现抽象数据类型(Abstract Data Type,ADT)是指一种数据类型及其相关操作的集合,它仅根据其行为特征来描述数据类型,而不考虑具体的实现细节。
ADT的实现在不同的编程语言中有不同的方式,本文将探讨在C语言中实现ADT的方法和技巧。
一、ADT的概念和特点ADT是指抽象出的数据类型,它的基本特点包括:封装性、继承性和多态性。
封装性:ADT隐藏了数据类型的内部实现细节,只暴露对外的接口函数。
这样可以有效地保护数据并提供更好的封装。
继承性:ADT可以通过定义派生类型来扩展,从而实现继承关系。
多态性:同一种基本的ADT可以有不同的实现方式,不同的实现方式可以满足不同的使用需求。
二、使用结构体实现ADT在C语言中,可以使用结构体来实现ADT。
结构体可以将不同类型的变量组合在一起,形成一个更复杂的数据类型。
下面以一个简单的例子来说明如何使用结构体实现ADT。
假设我们需要实现一个有理数类型(Rational)的ADT,它包括两个整数类型的成员变量:分子和分母。
```ctypedef struct {int numerator; // 分子int denominator; // 分母} Rational;```我们可以通过定义一系列的函数来操作这个有理数类型。
比如,我们可以定义创建有理数的函数、有理数相加的函数等等。
```cRational create(int numerator, int denominator) {Rational r;r.numerator = numerator;r.denominator = denominator;return r;}Rational add(Rational r1, Rational r2) {Rational result;result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;result.denominator = r1.denominator * r2.denominator;return result;}// 其他操作函数...```通过以上的定义和函数实现,我们可以在程序中创建有理数类型的变量,并对其进行各种操作。
数据结构的抽象数据类型(ADT)

数据结构的抽象数据类型(ADT)数据结构是计算机科学中非常重要的概念,它是一种组织和存储数据的方式,能够高效地进行数据操作和管理。
在数据结构中,抽象数据类型(Abstract Data Type,ADT)是一个非常关键的概念,它定义了数据类型的抽象行为和操作,而不涉及具体的实现细节。
本文将介绍数据结构的抽象数据类型(ADT)的概念、特点以及在实际编程中的应用。
### 什么是抽象数据类型(ADT)?抽象数据类型(ADT)是一种数学模型,用来描述数据类型的抽象行为和操作。
它定义了数据类型的逻辑结构和操作集合,而不关心具体的实现方式。
在ADT中,数据类型被看作是一个黑盒子,只暴露了对外的接口和操作,而隐藏了内部的实现细节。
这种抽象的设计思想使得程序员可以更加专注于数据类型的逻辑结构和操作,而不需要关心具体的实现细节,从而提高了代码的可维护性和可扩展性。
### ADT的特点1. **封装性**:ADT将数据类型的逻辑结构和操作封装在一起,隐藏了内部的实现细节,只暴露了对外的接口和操作。
这种封装性使得程序员可以更加专注于数据类型的逻辑结构和操作,而不需要关心具体的实现细节。
2. **独立性**:ADT与具体的编程语言和平台无关,可以在不同的编程语言和平台上实现和使用。
这种独立性使得ADT具有很好的通用性和可移植性。
3. **抽象性**:ADT只关注数据类型的逻辑结构和操作,而不涉及具体的实现细节。
这种抽象性使得程序员可以更加灵活地使用和扩展ADT,从而提高了代码的可维护性和可扩展性。
4. **高效性**:ADT定义了数据类型的逻辑结构和操作,能够高效地进行数据操作和管理。
通过合理设计ADT,可以提高程序的执行效率和性能。
### ADT的应用在实际编程中,ADT广泛应用于各种数据结构和算法中,如栈、队列、链表、树、图等。
通过定义和使用ADT,程序员可以更加方便地实现和操作各种数据结构,提高代码的可读性和可维护性。
抽象数据类型与面向对象概念

抽象数据类型与面向对象概念1. 引言抽象数据类型〔Abstract Data Type,简称ADT〕和面向对象〔Object-Oriented,简称OO〕是计算机科学中两个重要的概念。
它们都是用来描述数据和操作的方式。
本文将介绍什么是抽象数据类型和面向对象的概念,并探讨它们之间的关系。
2. 抽象数据类型〔ADT〕抽象数据类型是一种计算机科学中的概念,用来描述数据的表示和操作。
它将数据的表示细节隐藏起来,只暴露出一组操作,这样其他代码就可以通过这组操作来访问和修改数据,而不需要了解具体的实现细节。
常见的抽象数据类型包括栈、队列、链表、集合等。
它们都有自己的定义和一组操作,可以通过这些操作来访问和操作数据。
抽象数据类型的一个重要特点是封装〔Encapsulation〕。
封装指的是将数据和操作封装在一起,对外部只暴露一组操作接口。
封装可以隐藏数据的具体表示细节,提高代码的可读性和可维护性。
3. 面向对象〔OO〕面向对象是一种编程范式,它将数据和操作封装到一个类〔Class〕中。
类是面向对象的根本概念,它代表着一类对象的抽象。
对象是类的实例,具有自己的状态〔属性〕和行为〔方法〕。
面向对象的核心概念包括继承〔Inheritance〕、多态〔Polymorphism〕和封装〔Encapsulation〕。
继承指的是一个类可以从另一个类继承属性和方法。
子类可以继承父类的属性和方法,并且可以拥有自己的属性和方法。
继承可以提高代码的重用性和扩展性。
多态指的是同一个操作可以作用于不同的对象上,产生不同的结果。
这种特性可以增加代码的灵巧性,使得程序可以处理不同类型的对象。
封装在面向对象中的含义和抽象数据类型中的含义类似,指的是将数据和操作封装到一个类中,对外部只暴露一组操作接口。
4. 抽象数据类型与面向对象的关系抽象数据类型和面向对象都是用来描述数据和操作的方式,它们之间存在一些相似之处。
首先,抽象数据类型的封装特性和面向对象的封装概念是类似的。
再次理解编程中的:抽象数据类型(ADTs)

再次理解编程中的:抽象数据类型(ADTs)抽象数据类型(ADT,abstract data type)是指一些数据以及这些数据所进行操作的集合。
再面向对象编程中,理解 ADT 是很重要的,当程序员充分理解了 ADT 后可以写出更加容易实现、修改的类(也就是 Go 中的 struct 以及方法)。
假如我们有一个界面,可以显示多种颜色、各种大小,如果没有用到 ADT,那么代码看起来类似于这样:currentColor = 'red'currentHeight = 10也就是说很直观的直接将功能代码写上去,如果是一个更复杂的功能,那么等号后面的内容就会更多。
这样写不是不可以,而是我们可以使用更好的方式来实现。
隐藏实现细节可以将数据类型隐藏起来,意味着如果数据类型发生改变,你只需在一处修改而不会影响到整个程序。
用白话来说,只在一个地方为这个字段信息赋值,而为其赋值这个操作封装起来,即使以后我们在赋值时改了代码,甚至说换了一种语言,对于调用者来说都是一样的。
改动更加独立当我们想为界面增加更多功能时,只需在一处添加代码即可,而且这一改动不会影响到其他程序。
接口更加见名知意对于直接用等号赋值这种代码,其实是不容易阅读的,就拿高度的赋值语句,10的单位是多少我们是不确定的,可能是mm,cm(尽管界面上都用px)。
更好的做法我们在其接口就说明,甚至说对于不同的单位我们可以创建不同的接口。
代码正确性假如我们界面有一个主题是边界都是黑色,那么我们之前的做法就是将black 赋值给对应字段。
其实这样做是有风险的,这样我们看代码时需要看到black 这个单词才能知道是否正确,更好的做法我们可以增加一个接口:SetBlackTheme()。
尽管这样我们看的是三个单词,但是对于使用者来说,不需要关心black 这个单词了的赋值了。
无需在程序内传递多余数据如果没有使用ADT,对于当前界面的颜色来说,red 这个数据就需要一直使用,或者说将他定义成一个全局变量,但是将这个封装到结构内,在 ADT 的子程序内才可以使用这个结构,ADT 之外的子程序就不必关系这些数据了。
抽象数据类型

抽象数据类型1.数据类型数据类型(data type)是⼀个值的集合和定义在这个值集上的⼀组操作的总称。
原⼦类型:如语⾔的整形、字符型等标准类型及指针等简单的导出类型和空类型。
结构类型:其值是由若⼲成分按某种结构组成的,因此是可以分解的,并且它的成分可以是⾮结构的,也可以是结构的,通常是由标准类型派⽣的。
例如,C/C++中的数组、结构等类型。
2.抽象数据类型(abstract data type, ADT)抽象数据类型是指⼀个数学模型以及定义在该模型上的⼀组操作。
它通常是指对数据的某种抽象,定义了数据的取值范围及其结构形式,以及对数据的操作的集合。
“抽象”的意义在于数据类型的数学抽象特性。
3.抽象数据类型的描述⽅法(D,S,P)D是数据对象,S是D上的关系集,P是对D的基本操作集。
4.抽象数据类型⼀般可以由数据对象、数据关系及基本操作来定义。
ADT 抽象数据类型{数据对象(数据对象的定义)数据关系(数据关系的定义)基本操作(基本操作的定义)}ADT 抽象数据类型名其中,数据对象和数据关系的定义⽤集合描述,基本操作的定义格式为返回类型基本操作名(参数表)5.对于每个操作,包含下列5个基本要素:输⼊前置条件过程输出后置条件6.基本操作有两种参数:赋值参数只为操作提供输出值;引⽤参数以&开头,除可提供输出值外,还将返回操作结果。
7.⾯向对象的程序设计(OPP)⽅法。
在⾯向对象程序设计语⾔中,借助对象描述抽象数据类型,存储结构的说明和操作函数的说明被封装在⼀个整体结构中,这个整体结构称为类(class),属于某个类的具体变量称为对象(object)。
8.ADT和类的概念实际上反映了程序或软件设计的两层抽象:ADT相当于是在概念层(抽象层)上描述问题,⽽类相当于是在实现层上描述问题。
抽象数据类型与C++中类的对应关系如下:抽象数据类型——类数据对象——数据成员(属性)基本操作——成员函数(⽅法)。
抽象数据类型

数据抽象是程序设计的基础部分,涉及 抽象数据对象及其操作的定义。
类型定义与封装
类型定义使得变量的声明简单化,只需在声明 中写入类型名。但是,该类型的数据对象的内 部结构不能对外封装。
不同大小的整数栈的声明:
Stk1: IntStackType.Stack(100); NewStk: IntStackType.Stack(20);
类属抽象类型定义的实例化
类属类型AnyStackType可以用不同的参数值 多次实例化,每次实例化均产生包中类型名 Stack的另一个定义。这样当栈在声明中被引 用时,有可能是含混的。
返回
类属抽象数据类型
语言固有的基本数据类型经常允许程序 员声明一类新的数据对象的基本类型, 然后规约数据对象的几个属性。这是简 单的多态形式。
如,PASCAL提供了基本的数组类型,但也 留下了用户可以进一步定义的部分,如下标 范围。
Type Vect = array [1..10] of real;
类属抽象数据类型通常有直接的实现。实例化 时,必须给出参数,编译器使用类属定义为模 板,插入参数值,然后编译该定义。 在程序执行过程中,只有数据对象和子程序出 现。包定义仅仅作为限制数据对象和子程序可 见性的设备,包本身并不出现在运行时。 如果类属类型定义被多次实例化,则该直接实 现可能过于低效,需要考虑避免产生过多的子 程序拷贝及重复编译。
返回
7.3 多态
多态是指单个操作或子程序名可指向一 组函数定义,具体定义的选择依赖于参 数和结果的数据类型。 多态的几种形式:
抽象数据类型

抽象数据类型抽象数据类型(ADT)是计算机科学中的一个重要概念,用于描述数据的逻辑结构和操作。
它将数据的表示和操作进行了抽象,使得数据的具体实现与其被使用的方式分离开来。
ADT通过定义数据的属性和操作,提供了一种将数据与其实现细节解耦的方式,使得程序开发更加灵活和可维护。
ADT的定义通常包括两个部分:数据的表示和操作。
数据的表示指的是数据的逻辑结构,即数据是如何组织和存储的。
操作指的是对数据的各种操作,包括创建、插入、删除、查找等等。
ADT的一个重要特点是封装性。
封装性指的是将数据的表示和操作封装在一起,外部程序只能通过指定的操作进行访问,而不能直接操作数据的表示。
这样可以确保数据的一致性,并隐藏实现的细节,提高了程序的安全性和可维护性。
常见的抽象数据类型包括数组、链表、栈、队列、堆、树、图等等。
每种抽象数据类型都有其特定的数据结构和对应的操作。
以数组为例,数组是一种线性表的抽象数据类型,在内存中连续存储相同类型的数据。
它的定义包括数据的表示和操作。
数据的表示是一个具有固定长度的连续存储空间,可以通过索引访问其中的元素。
操作包括创建数组、获取元素、修改元素等。
以栈为例,栈是一种特殊的线性表,只能在一端进行插入和删除操作。
栈的定义包括数据的表示和操作。
数据的表示通常使用数组或链表实现,操作包括入栈(push)和出栈(pop)等。
ADT在程序设计中具有重要的作用。
它提供了一种高级抽象的方式描述数据和操作,使得程序开发更加模块化和可重用。
例如,可以将ADT看作是一种接口,不同的数据结构可以实现相同的ADT,从而提供了一种替换的方式。
这样可以在不改变外部程序的情况下,改变内部数据结构的实现,从而提供了更多的实现选择和灵活性。
此外,ADT还可以帮助程序员更好地组织和管理代码。
通过将数据的表示和操作封装在一个逻辑单元中,可以提高代码的可读性和可维护性,并减少了代码的重复和冗余。
总结起来,抽象数据类型是一种将数据的表示和操作进行抽象的方式,在计算机科学中具有重要的作用。
抽象数据类型名词解释

抽象数据类型名词解释抽象数据类型又称原子类型,是一种能够将现实世界的对象和它们的数值之间的对应关系完全或部分抽象出来的数据类型。
记忆,即对于事物的名称、概念、属性等的识记过程。
语言信息的编码表示是以记忆为基础的。
语言信息的识别和理解要依靠人们的记忆。
人类由于在进化过程中逐渐形成了语言信息识别和储存的能力,这使得人类可以超越一般动物仅仅依赖本能来做出行动。
正是因为有了这个能力,我们才能利用大脑高度发达的思维能力去认识世界。
记忆的内容就是语言信息。
例如,我们听到和看到某一个词语,可能很快就可以在头脑中回忆起它的含义。
通过这样的认知活动,我们就已经完成了对该词语的记忆过程。
当然,在记忆过程中,所需要的识别、判断和评价也同时进行。
这些都是语言信息的识别和判断。
例如,在我们对一张地图进行识别和判断后,会发现该地图中包括了两个比较重要的信息。
其中之一是地图上那条我们认为非常重要的河流。
其二是,地图上标注的经纬线指向西北方向。
如果不告诉我们河流名字,我们可能会怀疑它是否属于内陆河。
但是,如果我们告诉我们它是印度河,则就不会怀疑它的确属于印度。
抽象数据类型也被称为原子类型,是能够保证各个类型具有互换性的数据类型。
在各个抽象数据类型中,都至少有一种构造体,它们有着相同的表示,并且可以转换为另一种构造体。
对于任意一个抽象数据类型的对象来说,只要它具备合适的类型,便能够被归入其中一个类型;对于任何一个类型来说,只要该类型能够满足相应的约束条件,便能够成为另一个类型的构造体。
在程序设计语言中,数据类型与对象类型之间的映射关系就是一种抽象的关系,通常称之为抽象数据类型与对象类型的映射规则。
例如,我们在运行程序的过程中,必须按照一定的规则给每个变量赋予一个适当的类型,而无论这个变量的实际类型是什么。
例如,假设我们在命令窗口中输入要计算机数学公式1+2+3+4+5……,而电脑的屏幕显示了该输入结果,即1+3+4+5……。
通常,该电脑会直接按照最高层次的类型转换方法将这些公式转换为1+2+3+4+5……,然后根据这些公式计算出1+2+3+4+5……,最终得出这个运算结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集合结构是整个数据结构中的一种特殊情况,其元素之间不存在任何关系。 【例 1.5】一种数据结构的二元组表示为 B=(K,R),其中
数据的逻辑结构通常采用二元组来描述,其中一元为数据元素的集合,另一元为元素 之间逻辑关系的集合,每一个逻辑关系是元素序偶的集合,如<x,y>就是一个序偶,其中 x 为前驱,y 为后继。当数据的逻辑结构存在着多个逻辑关系时,通常对每个关系分别进行 讨论。
逻辑结构的另一种描述方法是图形表示,图中每个结点表示元素,每条带箭头的连线 表示元素之间的前驱与后继的关系,其箭头一端为后继元素,另一端为前驱元素。
专题 1 数据结构分类与抽象数据类型
5
若数据是线性结构、树结构或图结构,则除了要存储所有数据元素外,还要相应存储元素 之间的线性关系、层次关系或网状关系。
数据的存储结构分为顺序、链接、索引和散列 4 种。 顺序存储对应一块连续的存储空间,该空间的大小要大于等于存储所有元素需占有的 存储空间的大小,存储元素之间的联系(即逻辑结构)通常不需要附加空间,而是通过元 素下标之间的对应关系反映出来,只要简单的计算就可以得到一个元素的前驱或后继元素 的下标。顺序存储空间一般需要通过定义数组类型和数组对象来实现。 在链接存储结构中,元素之间的逻辑关系通过存储结点之间的链接关系反映出来,每 个存储结点对应存储一个元素,同时存储该元素的前驱和后继元素所在结点的存储位置, 或者说同时存储指向其前驱元素结点和后继元素结点的指针,通过这些指针能够直接访问 到其前驱元素和后继元素。链接存储空间通过定义元素的存储结点类型和对象来实现,所 有存储结点可以占用连续的存储空间(即数组空间),也可以占用不连续的存储空间,此 空间是由动态分配的每个结点的空间形成的。 索引存储是首先把所有数据元素按照一定的函数关系划分成若干个子表,每个子表对 应一个索引项,然后采用一种存储结构存储所有子表的索引项和采用另一种存储结构存储 所有子表中的元素。如存储汉字字典时,需要采用索引存储,首先按偏旁部首划分所存汉 字为若干子表,得到偏旁部首表,对于每个部首再按所属汉字的笔画多少划分子表,得到 检字表,检字表中的每个汉字对应汉字解释表(即字典主体)中的一个条目;然后再分别 存储部首表、检字表和汉字解释表。这里检字表是汉字解释表的索引,而偏旁部首表又是 检字表的索引,它是汉字解释表的二级索引。当存储的数据量很大时,通常都需要采用索 引存储,并且时常使用多级索引。 在索引存储中,各级索引表和主表(即数据元素表)通常都以文件的形式保存在外存 磁盘上,访问任一数据元素时,都要根据该数据元素的特征依次访问各级索引表和最后访 问主表,存取外存的次数至少等于建立索引的级数加 1。 散列存储方法是按照数据元素的关键字通过一种函数变换直接得到该元素存储地址的 方法,该存储地址为相应数组空间中的下标位置。用于散列存储所有数据元素的相应数组 空间称为散列表。通过定义用于计算散列存储地址的函数和定义存储数据元素的散列表能 够实现散列存储结构。 以上简要叙述了数据结构的有关概念,在以后的各专题中将会做深入和具体的讨论。
对应的图形表示如图 1.1 所示。
图 1.1 数据的线性结构示意图
结合表 1.1,细心的读者不难看出:R 是按职员年龄从大到小排列的关系。 在数据结构 linearity 中,数据元素之间是有序的,每个数据元素有且仅有一个直接前 驱元素(除结构中第一个元素 05 外),有且仅有一个直接后继元素(除结构中最后一个元 素 10 外)。这种数据结构的特点是数据元素之间的 1 对 1(1∶1)联系,即线性关系。我 们把具有这种特点的数据结构叫做线性结构。
对于现实世界中的同一种数据,根据研究问题的角度不同,将会选用不同的逻辑结构; 对于一种逻辑结构,根据处理问题的要求不同,将会选用不同的存储结构。
对于复杂的数据结构,不论从逻辑层面上还是从存储层面上看,都可能包含有多个嵌 套层次。如假定一种数据结构包含有两个层次,第一层(顶层)的逻辑结构可能是树结构, 存储结构可能是链接结构;第二层(底层)的逻辑结构可能是线性结构,存储结构可能是 顺序结构。第一层结构就是数据的总体结构,第二层结构就是第一层中数据元素的结构。
2
专题 1 数据结构分类与抽象数据类型
职工号 01 02 03 04 05 06 07 08 09 10
姓名 万明华 赵宁 张利 赵书芳 刘永年 王明理 王敏 张才 马立仁 邢怀常
表 1.1 教务处职员简表
性别 男 男 女 女 男 女 女 男 男 男
出生日期 1962.03.20 1968.06.14 1964.12.07 1972.08.05 1959.08.15 1975.04.01 1972.06.28 1967.03.17 1975.10.12 1976.07.05
K={k1,k2,k3,k4,k5,k6} R={R1,R2} R1={<k<k2,k1>,<k5,k4>,<k5,k6>} R2={<k1,k2>,<k2,k3>,<k3,k4>,<k4,k5>,<k5,k6>}
若用实线表示关系 R1,虚线表示关系 R2,则对应的图形表示如图 1.5 所示。
数据的存储结构通常采用一种计算机语言中的数据类型来描述,通过建立数据存储结 构的算法来具体实现。
数据的逻辑结构或存储结构也时常被简称为数据结构,读者可根据上下文来理解。 下面通过例子来说明数据的逻辑结构。 假定某校教务处的职员简表如表 1.1 所示。该表中共有 10 条记录,每条记录都由 6 个 数据项组成。此表整体上被看为一个数据,每个记录是这个数据中的数据元素。由于每条 记录的职工号各不相同,所以可把职工号作为记录的关键字,在下面构成的各种数据结构 中,将用记录的关键字代表整个记录。
抽象数据类型在 C++语言中是通过类类型来描述的,其数据部分通常定义为类的私有 或保护的数据成员,它只允许该类或派生类直接使用,操作部分通常定义为类的公共的成 员函数,它既可以提供给该类或派生类使用也可以提供给外部定义的类和函数使用。
在本书中,为了便于叙述和分析数据结构和算法,使读者容易理解和接受,所以在实 现所定义的抽象数据类型时,把数据部分用一种已知的数据类型(如结构或数组等)来实 现,把操作部分中的每个操作用普通函数来实现,这样能够同读者熟悉的 C 语言、C++语 言,甚至其他计算机语言很好地兼容起来。
K={01,02,03,04,05,06,07} R={<01,02>,<02,01>,<01,04>,<04,01>,<02,03>,<03,02>,
<02,06>,<06,02>,<02,07>,<07,02>,<03,07>,<07,03>, <04,06>,<06,04>,<05,07>,<07,05>}
专题 1 数据结构分类与抽象数据类型
3
【例 1.3】一种数据结构的二元组表示为 tree=(K,R),其中
K={01,02,03,04,05,06,07,08,09,10} R={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<03,07>,
<03,08>,<03,09>,<04,10>}
职务 处长 科长 科长 主任 科员 科员 科员 科员 科员 科员
部门
教材科 考务科 办公室 教材科 教材科 考务科 考务科 考务科 办公室
【例 1.1】一种数据结构的二元组表示为 set=(K,R),其中
K={01,02,03,04,05,06,07,08,09,10} R={}
在数据结构 set 中,只存在有元素的集合,不存在有关系,或者说关系为空。这表明只 考虑表中的每条记录,不考虑它们之间的任何关系。把具有此种特点的数据结构称为集合 结构。
图 1.5 带有两个关系的一种数据结构示意图
从图 1.5 可以看出:数据结构 B 是图结构。但是,若只考虑关系 R1 则为树结构,若只 考虑关系 R2 则为线性结构。
下面简要讨论数据的存储结构。 存储数据不仅要存储数据中的每个数据元素,而且要存储元素之间的逻辑关系。具体 地说,若数据是集合结构,则只需要存储所有数据元素,不需要存储它们之间的任何关系;
对应的图形表示如图 1.4 所示。 如果说 R 中每个序偶里的两个元素所代表的职员是好友的话,那么 R 关系就是人员之
4
间的好友关系。
专题 1 数据结构分类与抽象数据类型
图 1.3 数据的图结构示意图
图 1.4 图 1.3 的等价表示
从图 1.3 或 1.4 可以看出,结点之间的联系是 M 对 N(M∶N)联系(M≥0,N≥0), 即网状关系。也就是说,每个结点可以有任意多个前驱结点和任意多个后继结点。我们把 具有这种特点的数据结构叫做图结构,简称图。
对应的图形表示如图 1.3 所示。 从图 1.3 可以看出,R 是 K 上的对称关系。为了简化起见,我们把〈x,y〉和〈y,x〉这 两个对称序偶用一个无序对(x,y)或(y,x)来代替;在示意图中,我们把 x 结点和 y 结点 之间两条相反的有向边用一条无向边来代替。这样 R 关系可改写为:
R={(01,02),(01,04),(02,03),(02,06),(02,07), (03,07),(04,06),(05,07)}
1.2 抽象数据类型
抽象数据类型(Abstract Data Type,ADT)由一种数据结构和在该数据结构上的一组 操作所组成。抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽