![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 83
Michael_lcf
向阳而生、随心而动。你对我的百般注解,并不构成万分之一的我,却是一览无余的你。
展开
-
STL库实践
1 写在最前面的话 2 容器之 string 3 容器之 vector 4 容器之 deque 5 容器之 stack 6 容器之 queue 7 容器之 list 8 容器之 set/multiset 9 容器之 map/multimap 10 STL容器使用时机原创 2023-02-23 15:11:36 · 552 阅读 · 0 评论 -
C++基本语法
C++的继承C++怪异的变量格式原创 2023-02-20 23:02:54 · 122 阅读 · 0 评论 -
C 指针的深造
1 关于内存那点事2 指针的概念3 指针变量的定义方法4 指针的分类5 指针和变量的关系6 指针和数组元素之间的关系7 指针数组8 指针的指针9 字符串和指针10 数组指针11 指针和函数的关系12 经常容易混淆的指针概念13 特殊指针原创 2023-02-17 21:47:01 · 1194 阅读 · 0 评论 -
C 结构体、共用体、枚举
1、结构体 1.1、结构体类型定义 1.2、结构体变量的定义初始化及使用 1.3、结构体数组 1.4、结构体指针 1.5、结构体内存分配 1.6、位段 2、共用体 2.1、共用体的定义 2.2、共用体的特点 3、枚举 3.1、枚举类型的定义方法 3.2、枚举变量的定义方法原创 2023-02-16 22:01:14 · 343 阅读 · 0 评论 -
C语言中的函数
1、函数的声明2、声明的实践3、内存的分区4、普通的全局变量5、静态全局变量static6、普通的局部变量7、静态的局部变量static8、外部函数9、内部函数原创 2023-02-16 13:13:52 · 270 阅读 · 0 评论 -
9.1 查找表:静态查找表
顺序查找表 有序查找表 静态查找树表 索引顺序表原创 2021-08-14 13:44:37 · 2007 阅读 · 0 评论 -
7.3 图-最小生成树
图-最小生成树1 普里姆算法2 克鲁斯卡尔算法3 重(双)连通图和关节点4 两点之间的最短路径问题4.1 源点到其余各点的最短路径4.2 每一对顶点之间的最短路径5 拓扑排序6 关键路径待处理问题:如图假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1 条线路,如何在最节省经费的前提下建立这个通讯网?该问题等价于:构造网的一棵最小生成树,即:在 e 条带权的边中选取 n-1条 (不构成回路),使 “权值之和” 为最小。1 普里姆算法可取图中任意一个顶点v作为生成树的根,之原创 2021-08-13 08:47:56 · 2569 阅读 · 0 评论 -
7.2 图-遍历及简单应用
图-遍历及最小生成树1 图的遍历1.1 深度优先搜索(Depth First Search)1.2 广度优先搜索(Breadth First Search)2 最小生成树1 图的遍历从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。1.1 深度优先搜索(Depth First Search)深度优先搜索(Depth First Search)遍历类似于树的先根遍历,是树的先根遍历的推广。从图中某个顶点 V0V_{0}V0 出发,访问此顶点,然后依次从 V0V_原创 2021-08-09 23:10:00 · 1888 阅读 · 0 评论 -
6.4 树和二叉树-树和森林
1. 树和森林的表示方法树的三种存储结构1.1 双亲表示法#define MAX_TREE_SIZE 100//结点结构:typedef struct PTNode{ Elem data; int parent; //双亲位置域}PTNode;//树结构:typedef struct{ PTNode nodes[MAX_TREE_SIZE]; int root; //根结点的位置 int n; //结点个数}PTree;1.2 孩子链表表示法//孩子结点结构typede原创 2021-08-01 15:27:54 · 1029 阅读 · 0 评论 -
6.3 树和二叉树-线索二叉树
树和二叉树-线索二叉树1. 何谓线索二叉树2. 线索链表的结构描述:3. 线索链表的遍历算法4. 如何建立线索链表1. 何谓线索二叉树遍历二叉树的结果是:求得结点的一个线性序列。1 指向该线性序列中的“前驱”和“后继”的指针,称作“线索”。2 包含“线索”的存储结构,称作“线索链表”。3 与其相应的二义树, “线索二叉树”。对线索链表中结点的约定:在二叉链表的结点中增加两个标志域,并作如下规定:若该结点的左子树不空,则lchild域的指针指向其“左子树”,且左标志域的值为0;否则,lch原创 2021-08-01 10:33:40 · 142 阅读 · 0 评论 -
1 数据结构预备知识
1、指针1.1、指针的重要性 表示一些复杂的数据结构 快速的传送数据 使函数返回一个以上的值 能否直接访问硬件 能够方便的使用数组和字符串 是理解面向对象语言中引用的基础1.2、指针是C语言的灵魂地址 内存单元的编号; 从0开始的非负整数; 范围0-FFFFFFFF 【0 到 4G-1】;指针 指针就是地址 地址就是指针; 指针变量就是存放内存单元地址的变量; 指针本质上就是一个操作受限的非负整数;1.3、基本类型指针基本概念原创 2021-05-10 11:34:15 · 335 阅读 · 0 评论 -
3.2 栈和队列-队列
3、队列(Queue)3.顺序队列定义typedef struct { int data[maxSize]; int front;//队首指针 int rear;//队尾指针}SqQueue;//顺序队类型定义循环队列的要素队空状态:qu.rear == qu.front对满状态:(qu.rear)%maxSize == qu.front进队操作:qu.rear = (qu.rear+1)%maxSize;qu.data[qu.rear]=x;出队操作:qu.front=(qu原创 2021-07-17 16:44:29 · 162 阅读 · 0 评论 -
五、基数排序
链式基数排序步骤:设置10个队列,f[i]和e[i]分别为第i个队列的头指针和尾指针。第一趟分配对最低位关键字(个位)进行,改变记录的指针值,将链表中记录分配至10个链队列中,每个队列记录的关键字的个位相同。第一趟收集是改变所有非空队列的队尾记录的指针域,令其指向下一个非空队列的队头记录,重新将10个队列链成一个链表。重复上述两步,进行第二趟、第三趟分配和收集,分别对十位、百位进行,最后得到一个有序序列。#define D 3typedef struct node{ int key;原创 2021-06-19 15:41:01 · 1088 阅读 · 0 评论 -
四、归并类排序
归并排序基本思想:将 两个 或 两个以上 的 有序子序列 “归并”为 一个有序序列 。1、2路归并排序2路归并排序 即: 将两个位置相邻的有序子序列R[l … m]和R[m+1 … n]归并为一个有序序列。排序过程设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1两两合并,得到n/2个长度为2或1的有序子序列再两两合并,……如此重复,直至得到一个长度为n的有序序列为止void mergesort(JD r[],int n){ int i,s=1; JD t.原创 2021-06-19 15:10:02 · 431 阅读 · 0 评论 -
三、选择类排序
1、简单选择排序排序过程:1、首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换2、再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换3、重复上述操作,共进行n-1趟排序后,排序结束typedef int KeyType; //定义关键字类型为整数类型typedef int InfoType;typedef struct { KeyType key; //关键字类型 InfoType info; //其他数据项类型}原创 2021-06-19 13:34:40 · 1853 阅读 · 0 评论 -
二、交换类排序
冒泡排序、快速排序的思想、代码实现、时间性能分析原创 2021-06-19 12:57:19 · 4208 阅读 · 0 评论 -
一、插入类排序
直接插入排序、折半插入排序、表插入排序、希尔排序(缩小增量排序)的思想、代码实现、时间复杂度分析原创 2021-06-17 10:57:22 · 3466 阅读 · 0 评论 -
2.3 线性表的链式映象
//线性表的链式表示和实现//线性表的单链表存储结构# include <stdio.h># include <malloc.h> //包含了malloc函数# include <stdlib.h> //包含了exit函数typedef int ElemType;typedef int Status;#define OK 1#define ERROR 0 typedef struct LNode{ ElemType data; struct原创 2021-05-12 19:59:20 · 359 阅读 · 0 评论 -
2.2 线性表的顺序映象
// 线性表的动态分配 顺序存储结构# include <stdio.h># include <malloc.h> //包含了malloc函数# include <stdlib.h> //包含了exit函数#define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量#define LIST_INCREMENT 10 // 线性表存储空间的分配增量typedef int ElemType; // typedef int Stat原创 2021-05-12 14:53:48 · 1056 阅读 · 0 评论 -
1.数组-struct实现
# include <stdio.h># include <malloc.h> //包含了malloc函数# include <stdlib.h> //包含了exit函数//定义了一个数据类型,该数据类型的名字叫做struct Arr, 该数据类型含有三个成员,分别是pBase, len, cntstruct Arr{ int * pBase; //存储的是数组第一个元素的地址 int len; //数组所能容纳的最大元素的个数 int cnt; //原创 2021-05-11 11:39:04 · 1085 阅读 · 0 评论 -
7.1 图-数据类型及存储表示
图1 抽象数据类型图的定义2 图的存储表示2.1 数组表示法2.2 邻接表2.3 十字链表2.4 邻接多重表附:常用名词和术语1 孤头、弧尾、琢、有向图:2 边、无向图3 网、子图4 完全图、稀疏图、稠密图5 邻接点、度、入度、出度6 对有向图来说,7 路径、路径长度、简单路径、简单回路8 连通图、连通分量、强连通图、强连通分量9 生成树、生成森林1 抽象数据类型图的定义ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。\qquad V是具有相同特性的数据元素的集合,称原创 2020-09-06 11:10:31 · 710 阅读 · 0 评论 -
6.1 树和二叉树-类型定义
树和二叉树1.树的类型定义2.二叉树的类型定义3.二叉树的存储结构4.二叉树的遍历5.线索二叉树6.树和森林的表示方法7.树和森林的遍历8.哈夫曼树与哈夫曼编码树的基本概念树的基本术语树的性质树的存储结构顺序存储结构链式存储结构二叉树的定义二叉树的创建1.树的类型定义2.二叉树的类型定义3.二叉树的存储结构4.二叉树的遍历5.线索二叉树6.树和森林的表示方法7.树和森林的遍历8.哈夫曼树与哈夫曼编码树的基本概念树(Tree)是n(n>=0)个节点的有限集合。n=0时,称为空树。原创 2020-09-06 10:18:37 · 653 阅读 · 0 评论 -
3.1 栈和队列-栈
栈和队列 - 栈 Stack 1栈的类型定义2栈的应用举例例一、数制转换例二、括号匹配的检验例三、行编辑程序问题例四、迷宫求解例五、表达式求值例六、实现递归3栈类型的实现栈1栈的类型定义ADT Stack{数据对象:D={ai∣ai∈ElemSet;i=l,2,...,n;n⩾0}D=\{a_{i} | a_{i} \in ElemSet; i=l,2,...,n; n \geqslant 0\}D={ai∣ai∈ElemSet;i=l,2,...,n;n⩾0}数据关系:R1={<ai原创 2020-09-06 09:54:29 · 481 阅读 · 0 评论 -
4. 串和KMP算法
KMP算法前言前言问:有一个字符串"BBCABCDABABCDABCDABDE",里面是否包含另一个字符串"ABCDABD"?定长存储结构//maxSize表示串的最大长度;//str数组长度定义为maxSize+1,因为多出一个'\0'作为结束标记;#define maxSize 10typedef struct Str { char str[maxSize + 1]; int length;} Str;变长存储结构typedef struct Str { char *ch;原创 2020-09-03 09:59:20 · 769 阅读 · 0 评论 -
2.1 线性表的类型定义
0. 预备知识.1. 线性表.2. 栈和队列.线性结构:是一个数据元素的有序(是指数据元素次序有序)集。线性结构的基本特征:1,集合中必存在唯一的一个"第一元素";2,集合中必存在唯一的一个"最后元素"3,除最后元素之外,均有唯一的后继;4,除第一元素之外,均有唯一的前驱,2.1线性表的类型定义2.2线性表类型的实现顺序映象2.3线性表类型的实现链式映象2.4一元多项式的表示ADT List{数据对象:D={ai∣ai∈ElemSet;i=1,2,...,n;n⩾0}D=\{原创 2020-09-02 11:22:24 · 636 阅读 · 0 评论 -
常用排序(C版)
注:本文均采用升序排列。将将要排序的数组分为两部分:已排序部分、未排序部分;将第一个元素看做已排序的部分,剩余所有元素看做未排序的部分,拿未排序的元素中的第前面的元素与已排序部分每个元素对比;直到找到与选中的未排序元素小的void insertSortAsc(int arr[], int n){ int i, j, temp; for(i=1;i<n;++i){ temp=arr[i]; j=i-1; while(j>=0 && arr[j]>.原创 2020-08-12 15:46:24 · 249 阅读 · 0 评论 -
6.5 树和二叉树-赫夫曼树
树和二叉树-赫夫曼树1 最优二叉树(赫夫曼树)1.1 最优树的定义如何构造赫夫曼树呢?赫夫曼编码C语言版JAVA语言版赫夫曼(Huffman)树,又称最优树,是一类带权路径长度最短的树,有着广泛的应用。本节我们先讨论最优二叉树。1 最优二叉树(赫夫曼树)1.1 最优树的定义结点的路径长度定义为:从根结点到该结点的路径上分支的数目。树的路径长度定义为:树中每个结点的路径长度之和。树的带权路径长度定义为:树中所有叶子结点的带权路径长度之和 WPL(T)=∑wklkWPL(T)=\sum{w_{原创 2019-10-17 22:55:35 · 164 阅读 · 0 评论 -
链表-struct实现
线性表:在中文里,线性表也叫作顺序表。在英文中,它称为list, linear list等。它是最基础、最简单、最常用的一种基本数据结构,线性表总存储的每个数据称为一个元素,各个元素及其索引是一一对应的关系。线性表有两种存储方式:顺序存储方式和链式存储方式。数组(array):数组就是线性表的顺序存储方式。数组的内存是连续分配的,并且是静态分配的,即在使用数组之前需要分配固定大小的空间。可以通过...原创 2019-03-03 06:38:17 · 1910 阅读 · 0 评论 -
树、森林与二叉树的转换
来源:百度经验https://jingyan.baidu.com/article/19020a0a743851529d28421a.html一、将树转换为二叉树:树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树:1.在所有兄弟结点之间加一连线2.对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线。如下图所示:二、...转载 2019-03-06 09:43:27 · 1257 阅读 · 1 评论 -
6.2 树和二叉树-二叉树的存储结构及遍历
这里写目录标题1、二叉树的存储结构1.1、顺序存储结构1.2、二叉链表存储结构1.3、三叉链表存储结构1.4、双亲链表存储结构2、二叉树的遍历(图解)2.1 先序遍历:[`先访问根节点`]2.2 中序遍历:[`中间访问根节点`]2.3 后序遍历:[`最后访问根节点`]2.4 已知两种遍历序列求原始二叉树3、二叉树的遍历(代码)3.1、递归遍历二叉树描述3.2、非递归遍历二叉树描述4、遍历的应用4.1、统计二叉树中叶子结点的个数(递归先序遍历)1、二叉树的存储结构1.1、顺序存储结构#define MA原创 2019-03-04 14:10:07 · 928 阅读 · 1 评论 -
常用排序(JAVA版)
1. 概述按是否可一次在内存中排序完成,排序可分为两种:内部排序:数据记录在内存中进行一次排序。外部排序:因排序的数据量很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。未完,待续…...原创 2019-09-04 09:05:25 · 173 阅读 · 0 评论 -
稀疏数组
有一个棋盘中有一枚黑色棋子(1标识)和两枚白色棋子(2标识),其余没有棋子的地方0标识,这样的一个数组因含有大量的相同值,浪费空间,因此的,因此稀疏数组应运而生。0,1,0,0,00,0,0,0,00,0,2,2,00,0,0,0,0当一个数组含有大量重复的相同的值的时候,这个数组就可以转化为稀疏数组进行表示:1、稀疏数组共有3列。2、第一行记录的是原数组的’行数’,‘列数’,‘有效...原创 2019-09-09 12:57:09 · 216 阅读 · 0 评论 -
算法课(01)
时间复杂度度常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。时间复杂度为一个算法流程中,常数操作数量的指标。常用O(读作big O)来表示。具体来说,在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为f(N),那么时间复杂度为O(f(N))。评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的...原创 2019-01-31 09:15:51 · 296 阅读 · 0 评论