数据结构组成: 顺序表\链表 顺序栈\链栈 邻接矩阵\邻接表
1 逻辑结构(前驱和后继来判断)
线性结构:线性表 栈 队列
非线性结构:树(节点), 图(顶点)
2 存储结构
① 顺序存储:将数据结构中的各个元素按照其逻辑的顺序存放于一片连续的存储空间中。。。。。如:数组
② 链式存储:将数据结构中的各元素分布到储存器的不同点,用地址或者链指针方式建立他们的联系。(链式存储结构是重点,因为数据结构中的元素的关系在计算机内部很大程度上是通过地址或者指针来建立的)
③ 索引存储:数据文件 + 索引表。。。。例如:判断2个字符串中相同元素的个数,利用了ASCII表。
④ 散列(Hash) :根据数据元素的字符特殊字段即关键字key,计算数据元素存放的地址,然后数据元素按地址存放。。。。。
Typedef struct _node_
{
Datatype data;
Struct _node_ *next;
}linknode, *linklist;
3 运算
创建、插入(添加)、删除、排序、查找、判空、判满
算法:有穷规则的(语句或者指令)的有序集合。
特点:有穷、确定性、可行性、I、 O
评价好坏,时间复杂度、空间复杂度
七种常见时间复杂度
常数级、 对数级、线性级、 线性对数级、平方级、 立方级、 指数级
线性表:
什么是线性表:包含若干数据元素的一个线性序列。
顺序表sqlist.c (关键一个last 最后一个有效元素的下标)
① 置空表 L->last = -1; ②表长 L->last + 1; ③插入 插入前必须先判断插入位子的下标是否为合理(pos <0||POS>L->last+1||FullSqlist())删除函数
链表linklist.c (一个节点 3个属性,数据域,指针域,整个地址域)
① 插入(2种,递增有序插入是重点)、 删除(2种)、反转
双向链表:插入4步骤、删除2个步骤
链式队列的应用:单循环链表(joseph.c)创建单循环链表保存编号为1的结点地址、删除结点 (找到要删除结点的前一结点)
栈
特点:FILO 操作:入栈、出栈、栈是否为空
顺序栈sqstack.c (就一个关键的top)创建、判空、判满、入栈、出栈、GetTop。(讨论,带头结点的栈)
顺序栈应用:十六进制的转换
链式栈linkstack.c:基本运算:创建、判空、入栈、出栈、GetTop。
链式栈的应用expression.c:表达式的计算
队列
特点:FIFO 操作:入队、出队、队空
顺序队列sequeue.c: 基本运算:创建、判空、判满、入队、出队。入队出队front、rear不能简单加1;
链式队列linkqueue.c 基本运算:创建、判空、入队、出队。Front指向头结点(队头的前一结点)
树
树的基本概念 : 树是一个或者多个节点的有限集合。满足只有一个根节点root。
树的性质:主要5个 ①一个节点的子树的个数称为该节点的度。②树中节点的最大度数为树的度。 ③节点为0的节点是叶子节点。④路径 边数为路径长度。⑤层次,根节点的层数为1 ⑥树中节点层数的最大值为树的深度或者高度。
二叉树:
1.二叉树就2个特点:①节点的度<=2,且严格区分左右节点。。。
二叉树的5个性质:
① 二叉树的第i成的节点最多为 个。
② 深度为k的二叉树最多有 -1个。。
③ 满二叉树。深度为k层时有 -1的节点的二叉树。
④ 完全二叉树
⑤ 求n个节点的完全二叉树的深度 + 1 。。。。
二叉树的遍历:
先序:根 左 右
中序:左 根 右
后序:左 右 根
树的层次遍历:(思路。。。算法)
① 创建一个空队,r根节点入队,
② 判断队列是否为空,空-退出,不为空继续执行
③ 出对 Rè(打印),访问R的左右孩子,有,则入队
④ 返回②执行。。。。。。。
⑤
二叉树的创建:利用二叉树的性质:i的左孩子编号为2*i
tree.c代码实现二叉树的创建及三种遍历方法
二叉树的层次遍历:利用顺序队列
图
图的 基本术语:有向(弧)、无向图(边)、带权的叫网
图的基本操作:取第一个邻接点FirstAdj(G,U)、NextAdj(G,U,W)去下一个邻接点。。。。
图的存储结构:
邻接矩阵:顺序存储adjmatrix.c 利用二维数组,数组中元素为0或1,为1表示该下标的两个顶点间有边存在。FirstAdj、NextAdj
邻接表:链式存储adjlist.c 利用链表,N条链表
图的遍历adjmatrix.c
1.深度优先搜索DFS(matrix[][N],int v, int visit[])
算法:①先访问V,置标志位(visited[v] = 1)
② FirstAdj(G,V)= u;//存放所有的邻接节点
③ 判断 u < 0,返回
④ 若u>=0 即未被访问,则DFS(matrix,v,visit);
⑤ 跳转到③
递归调用
2.广度优先搜索BFS(matrix[][N], int v, int visit[])
利用队列
算法:①创建一个空队列,打印V,并置位,入队
② 判队空,
③ 出队 è V=Desq(sq);
④ U = FirstAdj(matrix,V);
⑤ 访问U的所有邻接点,为访问过的,则打印,置位,入队。
若U<0转到⑥,U未访问,打印,置位,入队。 U=NextAdj(matrix,v,u);
⑥ 转到②
Dijstra.c
查找
顺序查找、折半查找(时间复杂度的推导)、哈希查找
排序
选择排序、交换排序(冒泡)、快速查找