第一章 诸论
1.1什么是数据结构
1.1.1数据结构的定义
数据:所有能够输入到计算机中,且能被计算机处理的符号集合。而数据结构中主要讨论结构化数据
数据结构中主要讨论结构化数据。
数据项:用于描述数据元素,它是数据的最小单位。
数据元素:是数据(集合)中的一个“个体”,他是数据的基本单位。
数据对象:具有相同性质的若干个数据元素的合集,如整数数据对象是所有整数的集合。
默认情况下,数据结构中讨论额数据都是数据对象
数据结构:是指带结构的数据元素集合。
数据结构=数据对象(相同性质的数据元素集合)+结构(数据元素之间的关系构成结构)
数据结构中讨论的元素关系主要是指相邻关系或邻接关系。
数据元素之间的逻辑关系=数据的逻辑结构
数据元素及其关系在计算机存储器中的存储方式=数据的存储结构(或物理结构)
施加在数据上的操作=数据运算
1.数据的逻辑结构表示
数据的逻辑结构是面向用户的,它有多种形式
(1)表格:直接来源于现实世界。
(2)二元组:是一种通用的逻辑结构得表示方法。
一个二元组表示为:B=(D,R)
其中B是一种数据结构,它由数据元素的集合D和D上的二元关系到集合R所组成。其中:
D={di | 1≤i≤n,n≥0}数据元素的集合
R={rj | 1≤j≤m,m≥0}关系到集合
每个关系到用若干个序偶来表示:
1.序偶<x,y>(x,y∈D)其中x为第一元素,y为第二元素。
2.x为y的前驱元素
3.y为x的后驱元素
4.若某个元素没有前驱元素,则称该元素为原始元素;若某个元素没有后继元素,则称该元素为终端元素。
序偶<x,y>表示x、y是有向的,序偶(x,y)表示x、y是无向的。
(3)图形
2.数据的存储结构表示
数据在计算机存储器中的存储方式就是存储结构。它是面向程序员的。
逻辑结构映射存储结构。
设计存储结构得这种映射应满足两个要求:
(1)存储所有元素
(2)存储数据元素间的关系
存储结构:
1.结构体数据
存放学生表的结构体数据组Stud定义如下:
struct
{ int no;//存储学号
char name[8];//存储姓名
char sex[2];//存储性别
char class[4];//存储班号
}stud[7]={{1,“张斌”,“男”,“9901”},…{5,“王萍”,“女”,“9901”}};
两个逻辑元素上相邻元素直接映射存储空间也相邻。
这种存储结构的特点:
(1)所有元素占用一整块内存空间
(2)逻辑上相邻得元素,物理上也相邻(顺序存储结构)
2.链表
存放学生表的链表的结点类型StudType声明如下:
typedef struct studnode
{ int no;//存储学号
char name[8];//存储姓名
char sex[2];//存储性别
char class[4];//存储班号
struct studnode *next;存储指向下一个学生的指针
}StudType;
存储结构特点:
(1)一个逻辑元素用一个结点存储,每个结点单独分配,所有结点的地址不一定是连续的。
(2)用指针来表示逻辑关系(链式存储结构)
3.数据运算
数据远算是对数据的操作。分为两个层次:运算描述和运算实现。
对于“学生表”这种数据结构,可以进行一系列的运算:
(1)查找序号为2的学生姓名
(2)增加一个学生记录
(3)删除一个学生记录
(4)直接查找性别为女的学生记录
(5)直接查找班号为9905的学生记录
(6)…等运算描述
顺序存储结构中实现“查找序号为2点学生姓名”
讲解:
由于Stud名称表示整个存储结构
序号为2的学生信息存储在stud[1]元素中
通过stud[1].name直接找到该学生姓名,不需要从头开始一个一个找。
序号为2的意思是,表中开始数组stud[0],然后stud[2]是第二个数组,若序号为5,就是stud[4].name查出序号为4的名字
链式存储结构中实现“查找序号为2的学生姓名”
结论:
同一逻辑结构可以对应多种存储结构。
同样的运算,在不同的存储结构中,其实现的过程是不同的。