一、前言
本节内容将阐述数据结构中最简单的一些概念和术语。
前三个主要是概念,从第四个开始是抽象数据结构类型的重点内容。
二、数据、数据元素、数据项和数据对象
1. 数据(Data)
数据是能输入计算机且能被计算机处理的各种符号的集合。
- 数据是信息的载体
- 数据是对客观事物符号化的表示
- 数据是能被计算机识别、存储和加工的
数据的分类
- 数值型数据:整数、实数等
- 非数值型数据:文字、图像、声音等
2.数据元素(Data Element)
数据元素是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
数据元素也简称为元素,或称为记录、结点或顶点。
数据元素用于完整地描述一个对象。
3.数据项(Data Item)
数据项是构成数据元素的不可分割的最小单位。
数据、数据元素、数据项三者之间的关系:
数据 >数据元素 > 数据项
eg: 学生表 > 个人记录 > 学号、姓名······
4.数据对象(Data Object)
数据项是性质相同的数据元素的集合,是数据的一个子集。
数据元素与数据对象的关系
数据元素—组成数据的基本单位
与数据的关系:是集合的个体
数据对象—性质相同的数据元素的集合
与数据的俄关系:集合的子集
三、数据结构(Data Structure)
数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构。
数据元素是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构包括逻辑结构和存储结构两个层次。
数据结构包括以下三方面内容
1.数据元素之间的逻辑关系,也称为逻辑结构
2.数据元素及其关系在计算机内存中的表示(又称为映像),称为数据结构的物理结构或数据结构的存储结构
3.数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
1.逻辑结构
逻辑结构是描述数据元素之间的逻辑关系,与数据的存储无关,独立于计算机,是从具体问题抽象出来的数学模型。
数据的逻辑结构有两个要素,一是数据元素;二是关系。
逻辑结构的分类1(重点)
1.线性结构
有且仅有一个开始和一个终端结点,斌且所有结点都最多只有一个直接前趋和一个直接后继。
eg:线性表、栈、队列、串。
2.非线性结构
一个结点可能有多个直接前趋和直接后继
eg:树、图
逻辑结构的分类2
1.集合结构
结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。
2.线性结构
结构中的数据元素之间存在着一对一的线性关系。
3.树结构
结构中的数据元素之间存在着一对多的层次关系。
4.图结构或网状结构
结构中的数据元素之间存在着多对多的任意关系
2.存储结构(物理结构)
存储结构是数据元素及其关系在计算机存储器中的结构(存储方式),是数据结构在计算机中的表示
逻辑结构与存储结构的关系
- 存储结构是逻辑关系的映像与元素本身的映像。
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现。
- 两者综合起来建立了数据元素之间的结构关系。
四种基本的存储结构
- 顺序存储结构
- 链式存储结构
- 索引存储结构
- 散列存储结构
1. 顺序存储结构(重点)
用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
C语言中用数据来实现顺序存储结构。
2.链式存储结构(重点)
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。
C语言中用指针来实现链式存储结构。
3.索引存储结构
在存储结点信息的同时,还简历附加的索引表(Index)。
eg:手机通讯录
4.散列存储结构
根据结点的关键字直接计算除该结点的存储地址。
四、数据类型
1. C语言中的数据类型
- 基本数据类型:int,char,float,double等
- 构造数据类型:数组、结构、共用体、、枚举
- 指针、空(vodi)类型
- 也可以用typedef自己定义数据类型
一些最基本的数据结构可以用数据类型来实现。如:数组、字符串等。
而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示。
2.数据类型((Data Type))
(1)定义
数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
3. 抽象数据类型(Abstract Data Type,ADT) (重点)
(1)定义
是指一个数学模型以及定义在此数学模型上的一组操作。
- 由用户定义,从问题抽象出数据模型(逻辑结构)
- 还包括定义在数据模型上的一组抽象运算(相关操作)
- 不考虑计算机内的具体存储结构与运算的具体实现算法
(2)形式定义
抽象数据类型可用(D,S,P)三元组表示
D是数据对象,S是D上的关系集,P是对D的基本操作。
(3)定义格式 (重点)
ADT抽象数据类型名 {
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
} ADT抽象数据类型名
数据对象、数据关系的定义用伪代码表示。
基本操作的定义格式:(重点)
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
基本操作定义格式说明:
参数表:赋值参数 只为操作提供输入值
引用参数 以&打头,除可提供输入值外,还将返回操作结果。
初始条件:描述操作执行前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。若初始条件为空,则省略之。
操作结果:说明操作正常完成之后,数据结构的变化状况和应返回的结果。
ADT Circle{
D={r,x,y|r,x,y均为实数}
R = {<r,x,y>|r是半径,<x,y>是圆心坐标}
Circle(&C,r,x,y)
操作结果:构造一个圆
double Area(C)
初始条件:圆已存在
操作结果:计算面积
double Circumference(C)
初始条件:圆已存在
操作结果:计算周长
...
}ADT Circle
//复数的定义(抽象数据类型)
ADT Complex{
D = {r1,r2|r1,r2都是实数}
S = {<r1,r2>|r1是实部,r2是虚部}
assign(&C,v1,v2)
初始条件:空的复数C已存在
操作结果:构造复数C,r1,r2分别被赋以参数v1,v2的值
destroy(&C)
初始条件:复数C已存在
操作结果:复数C被销毁
}ADT Complex
Complex抽象数据类型中的基本操作:
Assign(&Z,v1,v2)
操作结果:构造复数Z,其实部和虚部,分别被赋以参数v1、v2的值。
Destory(&Z)
操作结果:复数Z被销毁
GetReal(Z,&realPart)
初始条件:复数已存在
操作结果:用realPart返回复数Z的实部值。
Getmag(Z,&ImagPart)
初始条件:复数已存在。
操作结果:用ImagePart返回复数Z的虚部
Add(z1,z2,&sum)
初始条件:z1,z2是复数
操作结果:sum返回两个复数z1,z2的和
······
概念总结
五、抽象数据类型的表示与实现(重点)
抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现。
即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。
//抽象数据类型“复数”的实现
typedef struct{
float realpart // 实部
float imagpart //虚部
}Complex //定义复数抽象类型
Void assign(Complex *A,float real,float imag){
A -> realpart = real; //实部赋值
A -> imagpart = imag; //虚部赋值
}