数据结构
一忙解千愁3
这个人不懒,但什么都没有留下......
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
KMP
title: KMP date: 2020-10-27 00:27:16 tags: [KMP, AL, C语言, 算法, 数据结构, DS] categories: DSandAL KMP算法,代码写的不好看,也不简洁,自己手敲的,也算是开天辟地了 后续持续优化代码 + 思路详细讲解,只希望让后来者少踩坑,起码不要踩我踩过的坑 T^T 先附上代码,后续更新详细讲解 非递归求next数组 // 开始手写KMP 自我感觉还是不太好的 // 串的底层用静态数组实现 #include <stdio.原创 2021-04-22 20:09:16 · 199 阅读 · 0 评论 -
链表头插, 链表逆置
title: reverse the linkList date: 2020-09-23 17:49:03 tags: [链表头插, 链表逆置, C语言, 算法, AL, DS] categories: DSandAL 链表的头插和逆置操作,很有技巧性,很值得思考 #include <stdio.h> #include <stdlib.h> typedef struct MyStruct { int data; struct MyStruct* next; }Node, .原创 2021-04-21 17:01:51 · 138 阅读 · 0 评论 -
二叉树与树
title: 二叉树 date: 2020-11-07 21:25:16 tags: 二叉树 categories: 数据结构 主要记录个人认为比较重要或是易错的知识 二叉树和树 区分 二叉树不是树, 因为相比于树,它多了两个条件, 每个结点的度最多是2 (此属性并不能否定它是一个树,因为可以认为是树的一种特殊形式)。 每个结点的孩子(若有孩子)有左右之分,这个条件直接否定了它是一个树,因为树的孩子可以没有左右之分。 二叉树的性质三 对任何一棵二叉树 T,如果其叶子数为 n_0,度为 2 的结点数.原创 2021-04-21 17:00:09 · 2779 阅读 · 0 评论 -
二分搜索
title: 二分搜索 date: 2020-12-22 20:25:07 tags: 二分搜索 categories: 数据结构 二分搜索,写的时候和快排做了一波对比,还是有一些收获的 // 二分搜索 // 二分搜索不同于快排中的二分递归, // 二分搜索路径只有一条,只要找到头就可以了 // 而快排中的二分需要全覆盖(因为是要对整个数组进行排序) // 这也是为什么二分搜索不使用递归也可以很轻松地实现 // 递归写法和非递归写法 #include <stdio.h> #define .原创 2021-04-21 16:59:36 · 133 阅读 · 0 评论 -
非递归后序遍历二叉树
title: 非递归后序遍历二叉树 date: 2020-12-25 20:06:53 tags: 后序遍历 categories: 数据结构 使用栈实现后序遍历二叉树 写了很久很久很久,可能是自己太长时间没写这样的代码了吧,简直把自己写崩溃了,不过还好,终于算是写出来了。有的是写了才发现存储结构开的不对, 有的是平时没有遇到的比较神奇的bug 也不算是神奇吧,就是平时没有遇见过的问题,也算是有收获了。爱瞎搞,爱作,可不就遇到很多阴间问题呗~ hhhhhh 里边附带了一个自己瞎搞想出来的偷懒生成满.原创 2021-04-21 16:58:24 · 383 阅读 · 0 评论 -
广义表之树的兄弟孩子表示法
title: 广义表之树的兄弟孩子表示法 date: 2020-11-17 15:55:55 tags: 兄弟孩子广义表 二叉树 categories: 数据结构 用兄弟孩子广义表来表示二叉树 对比 二叉树转化来的兄弟孩子广义表和普通的兄弟孩子广义表并不相同 二叉树转换成的兄弟孩子广义表没有明确的一块内存结构来直接表示它是叶子节点还是双亲结点,而是通过 指针 tp 来隐式地表示,tp 指向空,表示它没有孩子节点,否则,有孩子结点 普通的兄弟孩子广义表则是通过 tag = 0 或 1 来表示.原创 2021-04-21 16:57:45 · 1675 阅读 · 0 评论 -
稀疏矩阵转置
title: 稀疏矩阵转置 date: 2020-10-30 14:38:52 tags: 稀疏矩阵转置 categories: 数据结构 稀疏矩阵的转置 #include <stdio.h> #define MAX_LENGTH 100 // 定义一个用来表示非零元素的结构体 typedef struct a { // 非零元素的行下标 int rowIndex; // 非零元素的列下标 int colIndex; // 非零元素的值 .原创 2021-04-21 16:57:03 · 257 阅读 · 0 评论 -
快速排序
title: 快速排序 date: 2020-11-01 21:45:34 tags: 快速排序 categories: 数据结构 快速排序,分治递归 主要思想 分治(二分)递归 取一个标准值,将比标准值小的放在标准值前,比标准值大的放在标准值后。 此操作视为进行了一次快排 然后对标准值前面的子数列和标准值后面的子数列分别进行快排,就这样通过调用递归函数不断地二分…直到第一步快排得到的前面的子数列在不断二分过程中得到的最后一个子数列的标准值和begin相等为止。 二分递归比较难理解,建议在纸上演算一下.原创 2021-04-21 16:55:50 · 125 阅读 · 0 评论 -
双向链表基本操作
title: 双向链表基本操作 date: 2020-10-12 21:12:51 tags: 双向链表 categories: 数据结构 双向链表的基本操作 初始化一个空的双向链表 尾插添加结点 顺序随机掉头逆序打印双向链表 按序号添加结点 按序号删除结点 // 双向链表 #include <stdio.h> #include <stdlib.h> typedef struct linkList { int dat.原创 2021-04-20 19:02:13 · 301 阅读 · 0 评论 -
头指针单向链表基本操作
title: 头指针单向链表基本操作 date: 2020-10-04 16:47:34 tags: 单链表基本操作 categories: 数据结构 感觉每次自己提前写的东西都和老师讲的书上内容不太一样= = 当然大多数是老师讲的更正规一些,毕竟我只是一个会了链表本质就瞎玩的人 属于自己琢磨,自己造的那种,很多东西也是不怎么规范 但是有的东西我就觉得自己的更好 比如下面所说… 课本上写的是以头指针为基本单位,每次开一个头指针,即可视为开辟了一个链表。 而我参考了动态数组静态数组的写法,将头指针作为了.原创 2021-04-20 19:01:37 · 320 阅读 · 0 评论 -
稀疏矩阵乘法
title: 稀疏矩阵乘法 date: 2020-11-09 19:31:44 tags: 稀疏矩阵运算 categories: 数据结构 在本算法中,两个稀疏矩阵的特性都有用到 规定 规定以下变量名称,本文讲述 矩阵A × 矩阵B = 矩阵C 的运算过程 需要用到的存储结构有: 矩阵A,矩阵 B 的原始二维数组(2个) 矩阵A,矩阵B 的三元组数组(2个) 存储 矩阵A,矩阵B 每行有多少个非零元的数组(2个,分别存A、B矩阵) 存储 矩阵B每行首个非零元在三元组数组中的位置的数组(1个) 需要开.原创 2021-04-20 19:00:56 · 2750 阅读 · 1 评论 -
简单选择排序
title: 简单选择排序 date: 2020-12-22 21:35:48 tags: 排序算法 categories: 数据结构 选择排序 ,最简单的排序算法之一 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 O(n^2) O(n^2) O(1) 不稳定 // 选择排序 // 首先通过 n –1 次关键字比较,从 n 个记录中找出关键 // 字最小的记录,将它与第一个记录交换。 // 再通过 n –2 次比较,从剩余的 n –1 个记录中找出关键 // 字次小的记录,.原创 2021-04-20 19:00:21 · 148 阅读 · 0 评论 -
循环队列
title: 循环队列 date: 2020-10-22 21:14:05 tags: 循环队列 categories: 数据结构 循环队列,底层内存结构:静态数组 灵魂思想: 将指针的自增改为 指针 = (指针+ 1) % (数组的真实长度) // 循环队列 // 为了区分空队列和满队列 // 在这里我们认为当整个数组只剩下队尾的那块空间时,队列已满 // 当对头和队尾相等时,列队空 // 因此 队列中成员个数的最大值是 MAX_SIZE - 1 #include <stdio.h>.原创 2021-04-20 18:59:35 · 181 阅读 · 0 评论 -
循环链表的打印 合并
title: 循环链表的打印 合并 date: 2020-10-02 21:12:27 tags: 打印、合并循环链表 categories: 数据结构 本文中的所有操作均使用 设有尾指针的循环链表完成,目前只写了打印和合并两个操作,后续持续更新~ 看名字都可以知道,使用尾指针的循环链表和使用头指针单链表的区别 顾名思义,很容易就看出它们两个有以下这两个区别: 前者没有头指针,只有尾指针,尾指针存的是尾结点的地址,即它指向尾结点,尾指针->next 就得到了头结点的地址 前者的尾结点.原创 2021-04-20 18:58:43 · 654 阅读 · 0 评论 -
依据广度优先的输入字符串 生成二叉树
title: 依据广度优先的输入字符串 生成二叉树 date: 2020-12-26 11:18:34 tags: 二叉树 categories: 数据结构 根据广度优先输入的字符串 生成一颗二叉树 说明 这个根据输入的字符串自动生成一个二叉树 使用的思想是广搜(BFS) 要用到队列生成二叉树 举个例子 输入 12634^7^^^58^^^^^ 生成的二叉树为: 1 / \ .原创 2021-04-20 18:57:52 · 271 阅读 · 0 评论 -
直接插入排序
title: 直接插入排序 date: 2020-12-22 16:48:21 tags: 排序算法 categories: 数据结构 直接插入排序,注释中给了比较详细的理解 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 O(n^2) O(n^2) O(1) 稳定 讲解版 #include <stdio.h> int main(void) { // 初始化一个数组,0号空间不用,给它赋值成0 int arr[11] = {0, 0, 8, 5, 1, 2, .原创 2021-04-20 18:57:04 · 189 阅读 · 0 评论 -
自动生成完全二叉树
title: 自动生成完全二叉树 date: 2020-12-25 20:22:05 tags: 完全二叉树 categories: 数据结构 需要写完全二叉树的算法时,再也不用费时间去初始化一个二叉树了hh~ 存储结构 二叉链表, 如果要写的算法不是基于二叉链表,那么肯定就偷不了懒啦 思路 基本思路就是直接生成一个数组长度length的节点 然后利用完全二叉树的性质和数组的下标把它们串起来 要用到的完全二叉树的性质 分支节点个数 = 总节点个数 整除 2 (在数学中就是 除以二 再向下取整) 序.原创 2021-04-20 18:56:15 · 961 阅读 · 0 评论 -
动态数组操作
动态数组操作均封装成函数,涉及到的操作有: 动态数组初始化 打印 添加元素 删除元素 代码附上 // 动态数组 #include <stdio.h> #include <stdlib.h> #define InitialSize 10 #define EachIncreaseSize 10 #define BatchAddNumber 10 typedef struct DynamicArray { int *array; int arrayLenth原创 2020-10-02 18:52:43 · 509 阅读 · 0 评论 -
合并两个有序链表
两个有序链表合并为一个有序链表。 使用三个指针分别起到遍历三个链表的作用。 #include <stdio.h> #include <stdlib.h> // 在这里宏定义链表1和链表2的长度 #define LISTONE_LEN 10 #define LISTTWO_LEN 6 typedef struct list { int data; struct list *next; } Node, *pNode; // 添加结点 void AddNode(pNo原创 2020-09-29 18:05:51 · 129 阅读 · 0 评论
分享