转计算机架构02-数据结构(C语言)02

参考课程:【(2025版)深入浅出《数据结构(C语言描述)》】 https://www.bilibili.com/video/BV1FyH3zzEcW/?p=2\&share_source=copy_web\&vd_source=8541a01b50589c05f56714cfb5fda7ff

1.字符串与数组

1.1字符串匹配_KMP算法

1.1.1 朴素匹配

两层循环,都能想到的,逐个字符去匹配。

1.1.2 KMP 算法

(1)原理解析:

给一个字符串和一个模式串,要求是:

如何得到next数组?又如何用next数组来帮助匹配?

示例如下:

制作next数组

那么接下来如何 基于模式串 制作next数组 呢?:

遍历模式串,对于第一个符号a,没有前面的内容,因此为-1,

b有前面内容a,但是前面内容a没有前后缀,不可拆分,因此为0。

第三个a的前面内容是ab,前缀是a,后缀是b,没有相同内容

使用next数组

如何使用制作好的next数组在 失配 时 辅助定位匹配 呢?

这个情况下,模式串中下标为5的先失配了,

而next中下标5对应的为2,

就拿模式串中下标为2的与字符串剩下部分进行匹配。

(2)代码实现

1.2 二维数组

1.2.1 内存中的二维数组

(1)按行优先存

大部分可接受

(2)按列优先存

1.2.2 特殊矩阵

略(与图结合学习)

以下为非线性结构

2.树和二叉树

2.1基础概念

2.1.1 树的定义

2.1.2 其他衍生概念

2.2 性质

2.2.1 树的基本性质

其他性质了解用,就不记了。

2.3 二叉树

2.3.1 二叉树定义

有排列要求的,最多两个叉的树。

2.3.2 二叉树基础形态

2.3.3 二叉树性质

2.3.4 特殊二叉树

2.4 二叉树的顺序存储

一般只有满二叉树采用顺序存储。不然会有很多空位。

2.5 二叉树的链式存储

2.5.1二叉树的定义

单向的??

一共三种类型,数据的类型、节点的类型以及 节点的指针(地址) 类型,可能后面有二级指针?

来改变指针里指向的地址。

2.5.2 二叉树的递归遍历

2.5.2.1 前序遍历

前序指的是先输出根节点

把每个节点的左孩子都读完,再从底层读右孩子:

那么以此类推,中序就是把printf放在左后中间,这样根节点在中间。

后序就是把printf放在左后后面,这样根节点在最后。

总结就是:前中后分别是 每个 节点 在它 子树 的 前中后。

2.5.2.2 遍历性质

2.5.3 二叉树的非递归遍历

2.5.4 二叉树层序遍历求深度

不同于递归遍历用栈,这个使用队列。

有点像广度优先,先把每层都走完。

2.5.5 线索二叉树

遍历虽然能得到线性化的二叉树(不同遍历方式得到的不同),但是每次操作都要遍历太麻烦;因此这里用线索二叉树,在不改变二叉树已有数据的情况下,对二叉树插入线索,针对不同遍历场景 直接类似"线性化二叉树"。

不改变二叉树已有数据,就只能利用各个叶子端空闲的指针域(即左右孩子)。

但是这样该如何区别叶子端与树?如何知道谁的指针域是左右孩子还是线索?

扩展节点的结构体:

此外还要安排上头节点:

这样一个基于中序遍历的双向循环链表就完成了。

2.6 哈夫曼树

2.6.1 基本概念

2.6.2 求解

2.7 树

2.7.1 树转化为二叉树

2.7.2 树的遍历

二叉树里的 前中序在这里叫前后根。没有中根,因为不只两个孩子。

3.图

相较与之前表、树对于数据元素的关注,图更加关注元素间的关系,也就是路径?

3.1 基本概念

3.1.1 图的定义

3.1.2 有向图与无向图

3.1.3 完全图

3.1.4 路径与长度

3.1.5 顶点的度

3.1.6 边的权与网

3.2 图的存储结构

3.2.1 邻接矩阵

系统工程学里学过原理:

代码实现:

因为重点在于路径,所以结构体上也要描述元素间的关系:

有向图的邻接矩阵是行指向列。

下面是定义邻接矩阵的代码:

复制代码
#include<stdio.h>
typedef char VertexType;//顶点类型
typedef int EdgeType;//边的权值的类型0或1
#define MAXSIZE 100//最大顶点数

//图的邻接矩阵结构体
typedef struct graph
{
    VertexType vertex[MAXSIZE];//顶点组成的数组
    EdgeType arc[MAXSIZE][MAXSIZE];//邻接矩阵
    int vertex_num;//顶点个数
    int edge_num;//边的个数
} Mat_graph;



int main(int argc, char const *argv[])
{
    
    return 0;
}

3.2.2带权值的邻接矩阵

不同于用0/1表示通断,inf表示断,因为0可能有歧义,可能被认为权值。

3.2.3 无向邻接表

用链表来表示关系:各元素当作 头节点,后面按照下标顺序即可。

所以要定义两种结构体,一种是各个头节点,一种是后续节点:

头节点:

后续节点:

综合各个结点与结点关系的结构体叫做邻接表:

其中,adjList是个数组。

3.2.4 有向邻接表

仅表示一步的,不要连续指向。表示 该节点指向XX.

3.2.5 有向 逆邻接表

表示流入该节点的。

3.2.6 带权值的邻接表

在结构体上多加个权值属性即可。

3.2.7 十字链表 表出入

既表达输入又表达输出。

先表示输出的:

再表示输入的,不过这个是竖过来看的链表:

3.2.8 邻接多重表

解决无向图双向的冗余问题。

3.3 图的遍历

3.3.1 深度优先DFS

无向图

关键是定义一个0/1数组表示 某元素有没有被访问过;

以及函数的递归使用

3.3.2广度优先BFS

类似于树,不用递归。结合队列。

3.4 最小生成树 算法

3.4.1 普里姆算法 Prim

求解 无向 连通 带权图 的 最小生成树

解决类似于最短线路铺设的问题。结果是个连通的带权值的图。把all结点弄一起,但是不能有回路。

思想类似于贪心算法,每次选择待选中的最小代价。一个点一个点的扩展。

3.4.2 克鲁斯卡尔 Kruskal

也是关于 最小生成树 的算法

每次找代价最小的边然后选择它(不要回路),直到所有点都点亮。

所以针对的对象是边。结构体也要针对边的属性分析。

要先对边按照代价来排序。

3.4.3 两算法小结

最小生成树的目标是找到能到达所有结点的树。

3.5 最短路径算法

接下来两种思路,两种算法。

3.5.1 Dijstar 算法

确定的是起点到所有点的最短距离。那么具体实现举例:

3.5.2 Floyd算法

后面练到再学。

3.6 拓扑排序

系统工程学里学过类似的。

入度为零的是起点:

出栈为任务执行完毕,每出栈就看有没有新入度为0的顶点,有就入栈,没有就继续出栈;

用邻接表实现。

3.7 关键路径

系统工程里也学过。

练时再学。

相关推荐
白狐_7986 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
Forever Nore8 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
旖旎夜光11 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
不一样的故事12613 小时前
芯片设计是一个高度复杂、分工精细的系统工程
数据结构·经验分享
梁辰兴14 小时前
软件工程:面向数据结构的设计方法
数据结构·软件工程·梁辰兴·面向数据结构的设计方法·jackson方法·warnier方法·方法比较
白狐_79814 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
hold?fish:palm15 小时前
链表的基本原理和实现(C++版本)
数据结构·c++·链表
码完就睡16 小时前
数据结构——树、二叉树基础概念
数据结构·算法
疯狂打码的少年17 小时前
【数据结构】栈:定义、顺序栈与链式栈
数据结构·笔记
wabs66618 小时前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径