线性表的链式储存用的是结构体
线性表是什么:
1.单链表:指针是重头戏,用到了结构体
静态链表:用结构体数组来表示链表,有两个部分
struct s {
int z;//该元素的数据内容
int d;//下一个元素的下标
}
struct s a[]= {}
循环链表:加个指针指向上一个元素
2.栈和队列
常见操作:增删改查,判空判满
顶部指针常用top=-1
节省空间:两个栈公用同一片空间,用两个不同的top指针,相向而行
递归与栈
栈与四则运算(先进后出的逻辑的运用)
先进后出+特定规则 形成的逻辑更加有趣
队列:
循环队列
空与满的判断
求队列长度
入队时队尾后移操作
出队的操作(出队时不用管目标位置的内容,下次入队时会覆盖)
链表关于链表为什么要有头节
串
字符串,空串,子串,ASCII码
串的操作
串的存储
模式匹配算法:一个一个比,一个个查,查完以后,得出结论
朴素,简单,但是麻烦,时间复杂度高,不好
于是有了它:KMP算法,就是利用模式串中的隐含信息,减少不必要的操作
KMP的缺陷
树(tree)
二叉树:
常用来表示两种关系:正反对错真假上下
特点
二叉树的特殊情况
二叉树的性质(主要是数学规律性质,从节点、支线、度的关系运算得到的)
总结:
树的遍历方法()
线索二叉树:为了使叶节点的指针域得到充分利用,添加了tag域,,使二叉树的遍历更加便捷
最后就变成了这样:成功的变成了一个双向链表还可循环
树,森林与二叉树的转换:
森林转换成二叉树
把每个树转换为二叉树
第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子、用线连接起来。当所有的二叉树连接起来后就得到了由森林转换来的二叉树。
哈夫曼树
可变长度编码需要满足前缀不重复
图的定义与术语
这四个是一个东西
图的存储结构
邻接矩阵(无向图)
0表示不存在线或弧(无穷表示没有线或弧),整数表示有线或弧,数字大小表示该线弧的权值
邻接表(稀疏图)
因为邻接矩阵对于稀疏图来说,边太少,容易造成空间资源浪费,
所以有人想出来用链表来表示图的边,,对于容易求出每个点的度,但是对于有向图(该点为弧尾),需要建立逆表(该点为弧头)才能求出顶点的度
加权以后是这个样子的
十字链表存储:存储有向图,可以直接遍历,得出出入度
邻接多重表
用于存储无向图(邻接矩阵空间浪费,邻接表的结点删除比较麻烦,因为有重复数据)
删除边和顶点都挺方便的
循着路子走就行
总结
图的遍历
广度遍历和深度遍历
广度优先遍历(BFS)
从一点开始,访问他的邻接点,然后从他的邻接点开始继续访问下一层邻接点(类似于树的层序遍历)
注:这种方法会涉及到队列(入队出队)的使用,得到的遍历序列是广度优先生成树(对非连通图则生成广度优先生成森林)
深度优先遍历(DFS)
最小生成树
prim算法怪怪的
克鲁斯卡尔
对比
prim:从某一个点出发,连接权值最小得到点,然后以新的集合去找下一个连通权值最小的点,直到全部连通
克鲁斯卡尔:把所有的边及其权值构造出数列,找出权值最小的边连在一起,如果已经连通就不连(注意连通不是直接相连,只要有路径能够得上就行)
接下来的内容难度陡升,只能做了解,学c学完之后