重点!第三章线性结构的妙用
组成数据的基本单位:数据元素 Data Element
(别名)元素Element; 结点Node; 记录Record
组成数据元素的每一项称为数据项Data Item,也称字段或域Field
数据项是数据的最小标识单位
数据数据元素
数据项
所有学生的学籍信息某一个学生的学籍信息
姓名,性别
数据元素DataElement之间的联系可以用前趋和后继来描述
紧邻某个元素之前的元素称为元素E的前趋
紧邻某个元素之后的元素称为元素E的后继
某个元素可以只有前趋没有后继,也可以只有后继没有前趋
逻辑结构:数据的组织形式,用来表示数据元素之间的逻辑关系
组成:数据元素的集合D;元素之间的前趋后继关系的集合R;
数据结构可以表示为:DS=(D,R)
三种(元素间)基本逻辑结构:
线性结构(存在一对一的前趋后继关系):学生档案信息,穿成一串
树形结构(只有一个处在最高层次的数据元素没有前趋,称为根节点,其他每个数据元素都有并且仅有一个前趋,每个数据元素的后继则没有个数限制):一本书的目录
图结构(每一个数据元素都可以有任意多个前趋和后继,任何两个结点之间都可能邻接):图结构
数据的物理结构(存储结构):
举例:计算机01~10班,共计10个班,分配到50个教室里,怎么分配?
数据元素及其关系在存储器中的存放形式称为数据结构的物理结构,也称存储结构
物理结构分类:
1.顺序存储结构:元素按某种顺序存储在连续的存储单元中,存储位置间的关系反映了元素间的逻辑关系
2.链式存储结构:元素存放在不一定连续的存储单元中,通过在元素中附加信息来表示与其相关的一个或多个其他元素的物理地址来建立元素间的逻辑关系
3.索引存储结构
4.散列存储结构
数据的运算:对数据元素进行某种操作
1.改变元素的个数
2.改变元素的顺序
3.改变元素之间的关系
4.浏览(遍历)每个元素
5.检索符合某个条件的数据元素
总结:
采用什么样的结构来描述数据:数据的逻辑结构
对于特定的逻辑结构,确定怎么在计算机中存放:数据的物理结构
线性表:由有限个相同类型的数据元素组成的有序序列,记为(a1,a2,a3,a4.......an)
除了a1和an之外,任意元素ai都有一个直接前趋ai-1和一个直接后继ai+1
a1无前趋
an无后继
表的长度:线性表中数据元素的个数(长度即个数)
空表:元素个数为0
线性表运算:
确定线性表是否为空
确定线性表的长度
查找某个元素
删除第i个元素
在第i个位置插入一个新元素
线性表的存储结构:
顺序存储结构:顺序表
链式存储结构:线性链表
顺序表
顺序表中的数据元素按照逻辑顺序依次存放在一组连续的存储单元中
每个元素ai的存储地址是该元素在表中位置i的线性函数
a1 | a2 | a3 | a4 | a5 | a6 | a7 | . | an-1 | an |
0 | 1 | 2 | 3 | 4 | 5 | 6 | n-2 | n-1 |
定义顺序表?sqList
typedef int DataType;
typedef struct sqList
{
DataType* list; //指向动态开辟的数组
int length; //有效数据
int maxLength; //容量大小
}sqList;
顺序表的运算
1.若干个同学坐在一排座位上,学生中间没有座位,有另外一个同学要坐到这一排同学的中间
2.某个同学离开中间的座位,中间的空座位要补齐
顺序表插入元素:
1.判断插入位置是否合理以及该表是否已满
2.从最后一个元素开始依次向前,将每个元素向后移动一个位置,直到第i个元素停止
3.向空出的第i个位置存入新元素x
4.将线性表长度加1
顺序表删除元素:
1.判断要删除的元素的位置的合理性
2.从第i+1个元素开始,依次向后指导最后一个元素为止,将每一个元素向前移动一个位置,此时第i个元素已经删除,(数据不用删除,就是拿新数据去覆盖掉之前的数据)
顺序表查找元素:
如果数据元素是基本结构类型:与数据元素本身进行对比
如果数据元素是结构体或类对象:与数据元素的某个属性比较
顺序表优缺点:
优点:
1.不需要为元素的逻辑关系增加额外的存储空间;
2.可以方便的随机存取顺序表中任何一个元素;
缺点:
1.元素进行插入和删除时需要进行大量元素的移动,操作效率低;
2.占用连续的存储空间,存储空间的大小在初始化时就必须确定;
线性链表
采用链式存储的线性表
特点:每个结点都分为两部分
数据域:存储元素的值
指针域:存放直接前趋或直接后继元素的地址信息
data | next |
链表的定义与初始化
求单链表的长度
链表的运算:插入新结点,删除新结点
其它形式的链表
单向循环链表:将单链表尾结点的指针由NULL改为指向头结点,首尾连接形成一个环形,简称为循环链表
双向链表:
prior | data | next |
双向循环链表
栈:拿一摞碗
只能在一端进行插入和删除操作的特殊线性表
允许进行插入和删除操作的一端称为栈顶,另一端称为栈底
特点:先进后出/后进先出
栈的主要操作:
入栈:进栈,压栈,在栈顶加入新的元素
出栈:退栈,弹栈,将栈顶元素删除
读栈顶元素:只读出栈顶元素,但不出栈
顺序栈的定义
入栈
出栈
取栈顶
一般很少用链式结构来表示栈
队列:排队买饭
只能在表的一端进行插入操作,在另一端进行删除操作的特殊线性表
允许删除元素的一端称为队头,允许插入元素的一端称为队尾
特点:先进先出,后进后出
队列的主要操作:
判断队列是否满
判断队列是否为空
入队:在队尾插入元素
出队:在队头删除元素
取队头元素
循环队列:将队列的头尾相连形成一个圆圈
当队尾和队头重叠时队列是空还是满?
约定:当队头队尾相等时,队空;当队尾加1后等于队头时,队满
队列的定义
入队
出队
链式队列
链式队列求长度
入队
出队
标准模版库
容器:list双向链表;vector大小可以动态增加的顺序表;queue队列;stack栈;string字符串