什么是数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
数据元素的三要素
数据结构包括三方面的内容:逻辑结构、存储结构、数据的运算。
逻辑结构
逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。数据的逻辑结构分为线性结构和非线性结构,例如:线性表是线性结构,集合、树、图是非线性结构。
存储结构
存储结构是指数据结构在计算机中的表示,分为顺序存储、链式存储、索引存储、数列存储。
顺序存储
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
优点:可以实现随机存储。
缺点:只能使用相邻的一整块存储单元。
链式存储
不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。
优点:不会出现碎片现象,能充分利用所有存储单元。
缺点:只能实现顺序存储。
索引存储
在存储元素信息的同时,还建立附加的索引表。
优点:检索速度快。
缺点:附加的索引表额外占用存储空间,增加和删除数据也需要修改索引表,会花费较多时间。
数列存储
根据元素的关键字直接计算出该元素的存储地址。
优点:检索、增加和删除结点的操作都很快。
缺点:若散列函数不好,则可能出现元素存储单元的冲突,解决冲突会增加时间和空间开销。
数据的运算
施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能,运算的实现是针对存储结构的,指出运算的具体操作步骤。
顺序表
线性表的定义
线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列。
其中唯一的第一个数据元素称为表头元素,唯一的最后一个元素称为表尾元素,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。
顺序表分类
- 静态顺序表
typedef int SLDateType;
#define Maxsize 50
typedef struct SeqList
{
SLDateType data[Maxsize];
int size;
}SL;
静态顺序表缺点:开辟的空间大小无法改变,空间太小不够使用,空间太大会造成浪费。
- 动态顺序表
typedef int SLDateType;
typedef struct SeqList
{
SLDateType* a;
int size;
int capacity;
};