1.1.1数据结构的定义
用计算机解决一个具体的问题大概分为以下步骤:
(1)分析问题,确定数据模型
(2)设计相应的算法
(3)编写程序,调试运行
而在此过程中,如何在我们计算机中为我们的问题的数据元素,以及它们之间的相关关系设计合适的表达形式,以及数据之间的基本运算便是我们数据结构要考虑的问题了。
----------------------------------------------------------------------------------------------
相关定义阐述:(数据、数据元素、数据项、数据对象、数据结构)
1、数据:描述客观事物的数和字符的集合
2、数据元素:数据的基本单位(数据集合中的个体) 。一个数据元素中可包含多个数据项
3、数据项: 具有独立含义的数据最小单位,也称字段或域
4、数据对象:性质相同的数据元素的集合 (数据的子集)
5、数据结构:指所有数据元素以及数据元素之间的关系。 可以看作相互之间存在某种特定关系的数据元素的集合
在上述关系当中:数据结构2班中的所有学生记录的集合便是一个数据结构2班学生数据
其中 每个同学的信息记录都是一个数据元素。 每个数据元素中都包含了若干个
数据项(姓名,学号,性别)
通常:一个数据结构的构成如下图
---------------------------------------------------------------------------------------------------
1.1.2 逻辑结构
数据的逻辑结构是从数据关系的逻辑关系上进行描述数据的,通常从求解问题中提炼而来
数据的逻辑结构与数据的存储无关,是独立于计算机的
(数据结构当中主要讨论 数据元素之间的相邻关系或邻接关系)
*数据的逻辑结构的表示形式 (表格 图形 二元组)
1、表格
2、图形
将上面的学生表用图形表示,用“学号”数据项唯一标识数据元素,箭头表示之间的相邻关系
3、二元组
二元组的表示形式
B=(D,R)
其中 B为数据的逻辑结构 D为数据元素的集合 R为D上二元关系的集合,即用于描述了D中数据元素之间的关系
其中每个关系r用若干个序偶来表示
序偶 <x,y> (x,y∈D)
1、序偶关系<x,y>表示 xy相邻 且 x在y前, y在x后 ,x为第一元素 y为第二元素
2、x为y的前驱元素 y为x的后继元素
3、没有前驱元素的元素为开始元素 ,没有后继元素的元素为终端元素
4、对于对称序偶,即x y之间相连,没有前后关系 则用小括弧 (x,y)表示 对称序偶用不带箭头的连线表示
举例:
逻辑结构的类型
1、集合
数据元素之间除了同属于一个集合的关系以外别无关系
2、线性结构
1数据元素之间的关系是存在一对一的关系
2、结构中只有一个开始元素,一个终端元素
3、除了开始元素和终端元素意外,每个元素都只有一个前驱元素和后继元素
3、树形结构
1、数据元素之间存在一对多的关系
2、特点:除开始元素以外,每个元素有且仅有一个前驱元素,除了终端元素之外,每个元素有一个或多个后继元素
(线性结构也可以看作一种特殊的树形结构)
将二元组表示 转化为图的表示形式
4、图形结构
1、数据元素之间存在多对多的关系
2、所有元素都可能有多个前驱元素和多个后继元素
3、树形结构是图形结构的特殊情况
1.1.3 存储结构
数据的逻辑结构在计算机存储器中的存储表示 称为数据的存储结构(映射),即数据的逻辑结构在计算机的存储实现
存储结构的类型
1、顺序存储结构
用一组连续的存储单元存放所有的数据元素。(即数据元素的存放占用于计算机存储空间的一整块连续空间)
逻辑关系上相邻的两个数据元素在存储空间上也相邻=>数据之间的逻辑关系可以由存储单元地址关系隐含表示(逻辑关系不占用额外的存储空间
优点:存储效率高,储存密度大,可进行随机存取(由逻辑序号计算元素对应的存储地址 直接进行数据的存取))
缺点:不利于数据的修改,对于数据的删除或者插入,需要移动一系列的元素
利用结构体数组可以完成线性结构数据的存储实现
2、链式存储结构
链式存储结构中,每个数据元素用一个内存节点存储,每个节点是单独分配的,所有的节点地址不一定连续,因此不是占用一整块内存空间进行存储的
其中,数据元素之间的逻辑关系,通过给每个节点附加一个指针域,用于存放相邻节点的存储地址,因此通过指针域我们可以将零散数据元素节点及进行链接。
优点:便于数据的删除和插入
缺点:存储空间利用率较低(分配给元素的存储空间一部分被逻辑关系占用), 无法随机存取
节点的构建
3、索引存储结构
存储数据元素的同时,还建立附加的索引表来标识 结点的地址。
存储所有数据元素信息的表称为主数据表,其中每个元素都有一个关键字和对应的存储地址
索引表由若干索引项组成,索引存储结构 是用结点的索引号(关键字)来确定结点存储地址。
4、哈希(或散列)存储结构
哈希存储结构的基本思想是 通过元素的关键字通过哈希函数直接计算出一个值,并将这个值作为该元素的存储地址
优点:查找速度快,只要给出关键字即可立即给出地址
哈希存储方式只存储元素的数据,而不存储元素的逻辑关系 一般只适用于对数据能够进行快速查查和插入的场合
1.1.4 数据运算
数据运算就是对数据实施的操作
每中数据结构都有对应的一组数据运算方式 如 插入删除查找更新排序等
数据运算方式最终要在对应的存储结构上用算法进行实现
因此我们将数据运算分为运算定义 和 运算实现两个层面
运算定义
1、是运算功能的描述
2、抽象的
3、基于逻辑结构
运算实现
1、程序员完成运算的实现算法
2、具体的
3、基于存储结构的
对于一种数据结构 它的逻辑结构总是唯一的,若我们使用不同的存储结构进行实现的话,那么所对应的运算算法也会有所不同
1.1.5 数据类型 和抽象数据类型
数据类型
在高级程序语言当中有定义许多数据类型,不同数据类型的变量所能取的值的范围不同,所能进行的操作不同
数据类型是一个值的集合和定义在此集合上的一组操作的总称
如int 数据类型
Int i=5,j=7,k;
k=i+j
因为 I j k 都属于int数据类型 而int 提供了多种运算
(数据类型是已经实现的数据结构)
C语言中有几个常用的数据类型
1、基本数据类型 short int long float double char
2、指针类型
3、数组类型
4、结构体 共用体
5、自定义类型 typedef
对于不同数据类型的变量的定义,其分配空间的形式有两种
1、静态存储空间分布 int a[8]
2、动态存储空间分布 char *p;
p=(char*) malloc (10*sizeof (char));
抽象数据类型(ADT)
指的是从求解问题的数据模型中抽象出来的数据逻辑结构和抽象运算,不考虑计算机的具体实现