数据结构入门
一、开篇,我们先了解 什么是数据结构?
1.1官方解释:
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科
1.2自我理解:
数据结构就是吧数据元素按照一定的关系组织起来的集合,用来组织和存储数据
1.3数据结构的分类
我们可以把数据结构分为逻辑结构和物理结构两大类
逻辑结构是从具体问题中抽象出来的模型,是抽象意义上的结构,按照对象中数据元素之间的相互关系进行分类的
其中 , 逻辑结构有四种基本类型:1.集合结构、2.线性结构、3.树状结构和图结构
-
1.集合结构:结合结构中数据元素除了属于同一集合外,他们没有其他的关系
-
2.线性结构:线性结构中的数据元素存在一对一的关系;
逻辑结构在计算机中真正的表示方式成为物理结构,又可以叫做存储结构,常见的物理结构有顺序存储结构、链式存储结构。
- 1.顺序存储结构
- 把数据元素放到地址连续的内存单元里面,其数据间的逻辑关系和物理关系是一致的,我们常见的数组就是顺序存储结构。
当然,顺序存储结构也存在一定的弊端,就像生活中的派对,有人插队,也有人离开,处于变化,所以这时候就需要链式存储结构。
- 2.链式存储结构
是把数据元素存放在认识存储单元里面,这组存储单元是连续的,也可以是不连续的,此时,数据元素之间的关系,不能反映数据元素之间的逻辑关系,所以我们需要引入指针存放数据元素的地址,通过指针找到元素的地址。 - 两者比较:
二、线性表
线性表是具有相同数据类型的n个数据元素的有限序列(n>=0),其中,n为表长,当n = 0时线性表是一个空表。若用L命名线性表,则其一般为
ai是线性表中的"第i个"元素线性表中的位序
a1是表头元素,an是表尾元素。
除了第一个元素除外,每一个元素有且仅有一个直接前驱;除了最后一个元素外,每个元素都有一个直接后继
- InitList(&L):初始化表。构建一个空的线性表L,分配内存空间
- Destroy(&L):销毁操作。销毁线性表,并且释放线性表L所占空间
- ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
- ListDelete(&L,I,&e):删除操作。删除表中第i个位置的元素,并用e返回删除元素的值
- LocateElem(L,E): 按值查找操作。在表L中查找具有给定关键字值得元素。
- GetElem(L,I):按位查找操作。获取表L中第i个位置的元素的值
小Tips:
①对数据的操作(记忆思路) —— 创销、增删改查
②C语言函数的定义 —— <返回值类型> 函数名 (<参数1类型> 参数1,<参数2类型> 参数2,……)
③实际开发中,可根据实际需求定义其他的基本操作
④函数名和参数的形式、命名都可改变(Reference:严蔚敏版《数据结构》) ⑤什么时候要传入引用“&” —— 对参数的修改结果需要“带回来”
*知识点:
三、顺序表
顺序表—> 用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中去,元素之间的关系有存储单元的邻接关系来体现。
#define MaxSize 10 //定义最大长度
typdef struct{
ElemType data[MaxSize]; //用静态的‘数组’存放数据元素
int length; //顺序表的当前长度
}SqList; // Sq:sequence ---->顺序 //顺序表的类型定义(静态分配方式)
// 给各个数据元素分配连
//续的存储空间,大小为
//MaxSize*sizeof(ElemType)
#define InitSize 10 //顺序表的初始长度
typedef struct{
ElemType *data; //指示动态分配数组的指针
int MaxSize; //顺序表最大容量
int length; //顺序表的当前长度
}SeqList; //顺序表的类型定义(动态分配方式)
1 )随机访问。即可以在0(1)时间内找到第i个元素
2 )存储密度搞,每个节点值存储数据元素。
3 )拓展容量不方便(采用动态内存分配实现时,拓展长度的时间复杂度比较高)
4 ) 插入、删除操作不方便,需要移动大量元素。