数据结构与算法(大话数据结构)

本文介绍了线性表的链式存储,包括单链表、静态链表、循环链表,以及栈、队列和递归的应用。涉及KMP算法、二叉树的性质和遍历、图的定义、存储结构(如邻接矩阵、邻接表、十字链表)及Prim和Kruskal算法。后续内容将深入到更高级的算法和数据结构。
摘要由CSDN通过智能技术生成

线性表的链式储存用的是结构体

线性表是什么:

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学完之后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值