在经过了一个学期的数据结构课程学习后,我对数据结构也有了一定的了解,因此在这里做个简单的小结
基础知识
数据结构的概念
- 逻辑结构
线性: 是指数据元素之间只存在一对一线性关系的数据结构- 集合中必存在唯一的一个”第一个元素”和”最后的元素”;
- 除最后元素之外,其它数据元素均有唯一的”后继”;
- 除第一元素之外,其它数据元素均有唯一的”前驱”。
非线性: 是指数据元素之间不只存在一对一线性关系的数据结构 - 一个结点元素可能对应多个直接前驱和多个后继;
- 必定存在至少一个根节点。
- 储存结构
顺序 顺序存储方法是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构,通常借助于程序设计语言中的数组来实现。
链式 链接存储方法它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的,由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。
索引 除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。
散列 选取某个函数,依照改函数来计算元素的存储位置,形成函数值和存储位置之间的一一对应,例如hash函数。 - 抽象数据结构(ADT) 是指一个数学模型以及定义在该模型上的一组操作,通常可以用以下三元组表示(D,S,P)其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。在下文中,采用如下方式定义抽象数据类型
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>算法的概念
对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 - 意义 算法代表着用系统的方法描述解决问题的策略机制,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
- 描述语言 通常采用伪代码
- 算法的评价
时间复杂度 算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做T(n)=Ο(f(n))
空间复杂度 算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
正确性 算法应当满足具体问题的需求。
可读性 算法的可读性是指一个算法可供人们阅读的容易程度。
健壮性 健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。递归的概念
程序调用自身的编程技巧称为递归 - 规律 一般来说,递归需要有边界条件、递归前进段和递归返回段。
- 结束 当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
常见线性结构的应用
线性表抽象数据结构
ADT List{
数据对象:D={ $a_i$ | $a_i$∈ElemSet , i=1,2,···,n , n≥0 }
数据关系:R1={<$a_{i-1}$,$a_i$> | $a_{i-1}$ , $a_i$∈D , i=2,···,n}
基本操作:
InitList(&L)
初始条件:无
操作结果:构造一个空的线性表L。
DestoryList(&L)
初始条件:线性表L已存在
操作结果:销毁线性表L
ClearList(&L)
初始条件:线性表L已存在
操作结果:将线性表L重置为空表
ListEmpty(L)
初始条件:线性表L已存在
操作结果:若L为空表,则返回TRUE,否则返回FALSE
ListLength(L)
初始条件:线性表L已存在
操作结果:返回L中数据元素个数
GetElem(L,i,&e)
初始条件:线性表L已存在,1≤i≤ListLength(L)
操作结果:用e返回L中第i个数据元素的值
LocateElem(L,e,compare())
初始条件:线性表L已存在,compare()是数据元素判定函数
操作结果:返回L中第1个与e满足compare()的数据元素的位序。若这样的数据元素不存在,则返回值为0
PriorElem(L,cur_e,&pre_e)
初始条件:线性表L已存在
操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
NextElem(L,cur_e,&next_e)
初始条件:线性表L已存在
操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义
ListInsert(&L,i,e)
初始条件:线性表L已存在,1≤i≤ListLength(L)+1
操作结果:在L中的第i个位置之前插入新的数据元素e,L的长度加1
ListDelete(&L,i,&e)
初始条件:线性表L已存在且非空,1≤i≤ListLength(L)
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
ListTraverse(L,visit())
初始条件:线性表L已存在
操作结果:依次对L的每个数据元素调用函数visit()。一旦visit()失败,则操作失败
}ADT List
1.顺序表
1.1 顺序表的结构定义
1 |
|
1.2 构造空的顺序表
1 | Status InitList_Sq(SqList &L) { |
1.3 销毁顺序表
1 | Status DestroyList_Sq(SqList &L){ |
1.4 清空顺序表
1 | Status ClearList_Sq(SqList &L){ |
1.5 判断顺序表是否为空
1 | Status ListEmpty_Sq(SqList L){ |
1.6 求顺序表的长度
1 | int ListLength_Sq(SqList L){ |
1.7 返回顺序表中的第i个元素
1 | Status GetElem_Sq(SqList L, int i, ElemType &e){ |
1.8 在顺序线性表L中查找第1个值与e满足compare()的元素的位序
1 | int LocateElem_Sq(SqList L, ElemType e, Status(*compare)(ElemType, ElemType)) { |
1.9 返回一个不是首元素的前驱
1 | Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType &pre_e){ |
1.10 返回一个不是末元素的后继
1 | Status NextElem_Sq(SqList L, ElemType cur_e, ElemType &next_e){ |
1.11 在顺序线性表L的第i个元素之前插入新的元素e
1 | Status ListInsert_Sq(SqList &L, int i, ElemType e) { |
1.12 在顺序线性表L中删除第i个元素,并用e返回其值
1 | Status ListDelete_Sq(SqList &L, int i, ElemType &e) { |
1.13 遍历顺序线性表
1 | Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)){ |
2.链表
2.1 链表数据结构的定义
1 | typedef struct LNode{ |
2.2 分配结点并赋值为e
1 | Status MakeNode(Link &p, ElemType e){ |
2.3 释放p所指向的结点
1 | void FreeNode(Link &p){ |
2.4 构造一个由L指向的空的线性表
1 | Status InitList(LinkList &L){ |
2.5 销毁由L指向的线性表
1 | Status DestroyList(LinkList &L){ |
2.6 在链表L的第i个元素之前插入新的元素e
1 | Status InsertElem(LinkList &L, int i, Link s){ |
2.7 删除链表L的第i个元素
1 | Status DeleteElem(LinkList &L, int i){ |
2.8 用e更新p所指向的当前结点
1 | Status SetCurElem(Link &p, ElemType e){ |
2.9 返回p所指结点中元素的值
1 | ElemType GetCurElem(Link p){ |
2.10 返回p所指结点的直接前驱的位置
1 | Position PriorPos(LinkList L, Link p){ |
2.11 用p返回线性表l中第i个结点的位置,并返回ok
1 | Status LocatePos(LinkList L, int i, Link &p){ |
2.12 用一个函数遍历表中所有结点
1 | Status ListTraverse(LinkList L, Status(*visit)(ElemType)){ |
3.栈
3.1 顺序栈
1 |
|
3.2 链栈
1 | typedef struct SNode { |
4.队列
4.1 循环队列
1 |
|
4.2 链队列
1 | typedef struct QNode { |
5.串
1 | typedef struct{ |
6.数组(十字链表实现)
1 | typedef struct Node {//十字链表的节点 |
常见非线性结构的应用
1.二叉树
1.1 二叉树的定义与遍历
1 | typedef struct BiTNode { |
1.2 二叉树的应用
1 | typedef struct BiTNode { |
1.3赫夫曼树
1 | struct HTNode { // 树中结点的结构 |
2.图
1 | typedef int Status; |
散列储存结构
哈希(Hash)表
特殊运算
1.查找
1 | typedef struct { |
2.排序
1 |
|