1.数据结构
程序 = 算法 + 数据结构
数据 data
对客观事物的符号表示
在计算机学科中 指所有事物可以输入到计算机中并被计算机进行处理的符号的总称
数据元素 data element
是数据的基本单位,在计算机中通常是作为一个整体来进行考虑和处理
一个数据元素可以由多个数据项(data item)来组成
数据项是数据不可分割的最小单位
例子:
全班同学的基本信息 -- 数据
张三的基本信息 -- 数据元素
张三的年龄 -- 数据项
数据对象 data object
是性质相同的数据元素的集合, 是数据的子集
结构:
数据元素之间的关系的不同特性 就称为结构
根据数据元素之间的关系的不同的特性, 通常分为以下4类基本结构:
(1)集合
结构中的数据元素之间 除了"属于某一个集合"的关系以外,没有其他任何关系
11 234 88888 99977 ...
(2)线性关系
数据元素之间的关系是线性的
int a[5] = {1,2,3,4,5};
(3)树状结构
数据元素之间的关系是树状的(层次)
(4)网状结构(图)
数据元素之间的关系是任意的
数据结构
研究数据本身 以及 数据元素之间的关系(逻辑关系)
数据结构的形式定义:
一个二元组:
Data_structure = { D, S }
D : 是数据元素的有限集
S : 是D上的关系的有限集
结构定义中"关系" 描述的是数据元素之间的逻辑关系
因此 称为数据的逻辑结构
数据结构在计算机中的表示 称为数据的物理结构, 或者 存储结构
逻辑结构的是一个虚的"想法"
存储结构(物理结构)是真实存在
2.线性关系
例子: 数据元素 数据元素之间的线性 26个英文字母: abcedfg 单个字符a必须在字符b的前面 班级学号: 1001,1002,1003.. 学号的顺序1001必须在1002的前面 ... 线性表: 线性表中的数据元素可以是各种各样的类型 但是 同一个线性表中的元素必定具有相同的属性 , 以及 属于同一个线性表中的相邻的两个数据元素之间存在序偶关系 若 将线性表记为: a1, a2, a3, a4, ... an (1)存在唯一一个被称为 "第一个" 的数据元素 (2)存在唯一一个被称为 "最后一个" 的数据元素 (3)除了第一个以外, 集合中的每一个元素都有一个且仅有一个 "前驱元素" (4)除了最后一个以外, 集合中的每一个元素都有一个且仅有一个 "后继元素"
例子: 1 3 5 7 9 11 .... 对于该线性表 在计算机中如何存储呢? 要保存什么东西? 数据 关系(逻辑关系) int a[] = {1,3,5,7,9,11};
线性表的物理结构的实现:
(1)顺序结构 --> 数组
线性表的顺序表示 指的是用一组地址连续的存储单元,依次存放线性表中的每一个数据元素
数据的存储 逻辑关系和物理关系是一致的
基本操作: 增删改查
(数组: 插入有序,二分查找,排序)
(2)链式结构 (链表)
线性表的链式结构 指的是不用地址连续的存储单元去存储元素
(数据元素的存储单元不一定连续的)
在保存数据元素的同时,还需要额外开辟一个空间 保存"逻辑关系"的上一下或者下一个
例子:
1,3,5,7,9
存储数据元素 1
1 数据要存储 int (数据)
&3 下一个元素的地址 * (关系)
存储数据元素 3
3 数据要存储 int (数据)
&5 下一个元素的地址 * (关系)
...
构造一个数据元素的数据类型, 把上面是数据存储
typedef int ElemType; //数据元素中 数据的类型
struct node //数据元素的类型
{
ElemType data; //数据域 --> 存储数据
struct node * next; //指针域 --> 保存逻辑上的关系(下一个)
};或者
typedef struct node
{
ElemType data;
struct node * next;
} Node;