![](https://img-blog.csdnimg.cn/20210810205327878.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 66
基于原理,基于C/C++实现数据结构的一系列算法
_(*^▽^*)_
个人水平有限,如果有写错的地方,或者可以改进的地方,希望网友能够批评指正!
展开
-
数据结构(8-3)二叉排序树(查找、插入删除)
一、基础理论1、特点:(1) 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 它的左、右子树又分别为二叉排序树。2、结构:二叉树参考资料https://blog.csdn.net/kexuanxiu1163/article/details/106168677?ops_request_misc=%257B%2522request%25...原创 2021-08-14 19:34:18 · 919 阅读 · 0 评论 -
数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
一、折半查找(二分查找)流程:开始时,min标志首,max标志尾,medium=(min+max)/2。然后即可开始查找,判断str[medium]和要查找的值是否相等:1、相等:min = medium+1 2、不相等:max=medium-1//折半查找(注:前提是有序序列)int Binary_Search(char ch){ int min = 0, max = strlen(str)-1; int medium; while (min &...原创 2021-08-12 21:56:42 · 403 阅读 · 0 评论 -
数据结构与算法(8-1)顺序表查找及优化
目录一、顺序表查找二、顺序表查找优化(重点)总代码一、顺序表查找从头到尾或从尾到头查找。//顺序表查找(需要判断两次)int ListSearch(char ch){ for (int i = 0; i < strlen(str); i++) //一次判断 { if (str[i] == ch) //二次判断 return i; } return -1;}顺序查找虽然简单,但是缺点也比较明显,就是效率比较低,两次判断,接下来原创 2021-08-11 21:51:11 · 381 阅读 · 0 评论 -
数据结构与算法(7-5)拓扑排序
1、原理实质:把有向图的顶点排成一个线性序列。(序列非唯一)思路:从AOV网中选择一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点或则AOV网中不存在入度为0的顶点停止。(最后一个顶点被输出还有顶点则说明有环)术语定义:DGA:有向无环图AOV网:数据在顶点,可以理解为面向对象。AOE网:数据在边上,可以理解为面向过程。示例:比如学习java系类(部分)从java基础,到jsp/servlet...原创 2021-08-10 21:12:17 · 338 阅读 · 0 评论 -
数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
一、最短路径概念最短路径,顾名思义,两结点之间最短的路径(可以是非邻接结点)。最小生成树和最短路径区别:最小生成树:连通图的最短路径。最短路径:两任意结点之间(可以非邻接)的最短路径。二、迪杰斯特拉(Dijkstra)算法优点:效率较高,时间复杂度为O(n^2)。缺点:只能求一个顶点到所有顶点的最短路径。 (单源最短路)1、原理1、先选定一个根结点,并选定一个数组,先确定未遍历前的初始距离,把距离最短的邻接结点选定为中间结点,并标记访问过,开始往下遍历,挨个原创 2021-08-09 21:55:59 · 15184 阅读 · 1 评论 -
数据结构与算法(7-3)最小生成树(普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法)
一、最小生成树简介用途:找到拓扑图的最短路径之和。注:最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。应用:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。二、普里姆算法(Prim)1、原理把树视为一个整体(顶点)。2、存储2-1、图顶点和权:...原创 2021-08-07 22:14:02 · 1324 阅读 · 1 评论 -
数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
一、深度优先遍历(DFS)原创 2021-08-04 21:00:44 · 3508 阅读 · 2 评论 -
数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)
目录一、BF算法(暴力算法)二、KMP算法三、KMP算法优化一、BF算法(暴力算法)一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配。虽然简单,但是需要较多的时间复杂度。//BF算法(暴力算法)//查找字符串位置(效率低)//挨个匹配,不匹配的话进入下一个,继续挨个匹配//注:字符串的末尾自动补'\0',用strlen()查找的长度比实际存放数据的长度多一个#include<stdio.h>#include<string.h原创 2021-08-01 21:10:42 · 162 阅读 · 0 评论 -
数据结构与算法(2-1)线性表之顺序存储(顺序表)
顺序表用数组存储数据元素,插入和删除等等也是类似数组的操作。一、插入(三种情况)1、索引不在数组范围内或数组长度大于等于限长,无法插入,直接退出;2、索引在数组中,需要向后移动后续的元素,腾出一个能放数据的空位;3、索引正好在数组末尾,则不需要移动数组,直接插入。二、删除(三种情况)1、索引不在数组范围内或数组长度大于等于限长,无法删除,直接退出;2、索引在数组中,需要向前移动后续的元素,把那个索引位置的元素直接覆盖掉,相当于删除了;3、索引正好在数组末尾,则不需要移动数组,原创 2021-07-30 10:22:46 · 201 阅读 · 0 评论 -
数据结构与算法(6-2)二叉树的存储结构(顺序存储、链式存储)
目录一、二叉树的顺序存储存储方式总代码二、二叉树的链式存储(二叉链表)1、存储结构2、创建二叉树总代码一、二叉树的顺序存储存储方式//树的顺序存储typedef struct{ char data;}BiTree;BiTree tree[MAXSIZE];总代码//二叉树的顺序存储#include<stdio.h>#include<math.h>#define MAXSIZE 20int num ...原创 2021-08-02 11:56:26 · 947 阅读 · 0 评论 -
数据结构与算法(1)高斯算法
//高斯算法(累加求和)//普通算法累加求和需要for()循环遍历求和,但高斯算法可以通过一个算式直接求得,大大节省//时间效率#include <iostream>#include <ctime>using namespace std;#define num 100000000int main(){ int i = 0, sum = 0; //算法1:累加(效率低) /*for (i = 1; i <= num; i++)...原创 2021-07-30 09:54:37 · 1677 阅读 · 0 评论 -
数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
目录一、顺序队列1、存储结构2、入队和出队一、顺序队列队列特征:先进后出、后进后出。1、存储结构//队列typedef struct{ int data[MAXSIZE]; int front; int rear;}SqQueue;SqQueue Q;2、入队和出队入队:从队尾放入元素,rear++出队:从队首取出元素,front++总代码//顺序队列//主要用front和rear分别指向队首和队尾//进栈时:...原创 2021-08-01 18:06:04 · 482 阅读 · 0 评论 -
数据结构与算法(6-5)二叉树的应用--哈夫曼树与哈夫曼编码
目录哈夫曼编码(最优二叉树)优势:缩短电文长度思想:过程:图解实现过程:总代码哈夫曼编码(最优二叉树)一、优势:缩短电文长度二、思想:获取每个字符出现的频率,用一个大小为[256]的数组保存(因为ASCII码是256个),最后作为每个字符的权重。权重越大,意味着出现频率越大,希望它的码长越短,这样总体电文最小。最后把这些字符(不重复部分)、权重依次放入结点中,把这些结点作为一个个元素,从小到大依次组成哈夫曼树。三、过程:先统...原创 2021-08-02 15:39:48 · 921 阅读 · 0 评论 -
C/C++二级指针概念及应用(有向图的邻接表(拓扑排序)、有向网图的邻接表、树的孩子表示)
二级指针:指向指针的指针。一般需要修改地址的时候会用到二级指针。注意:二级指针使用的时候,二级和一级指针都需要分配内存,单单只分配二级指针或者只分配一级指针的内存都会报错。(直接代码解释)//有向网图的邻接表//运用了二级指针:要直接修改地址需要用到二级指针#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<malloc.h>using namesp原创 2021-07-31 12:16:21 · 251 阅读 · 0 评论 -
数据结构与算法(6-3)二叉树的遍历(前序遍历、中序遍历、后序遍历、层序遍历)(层序遍历分别用队列和链队列实现)
目录一、前序遍历二、中序遍历三、后序遍历前中后序遍历总代码四、层序遍历(队列实现(主流))总代码五、层序遍历(链队列实现(自创))总代码二叉树的遍历分为前序、中序、后序以及层序遍历。前中后序是按照根结点的访问顺序来确定的,前中后序遍历的核心都是递归。一、前序遍历访问顺序:根->左->右普通二叉树遍历(前序):ABDCG扩展二叉树遍历(前序):ABD###C#G##实现顺序:1、生成根结点2、递归遍历左子树...原创 2021-08-02 14:59:18 · 3550 阅读 · 2 评论 -
数据结构与算法(7-1)图的存储(邻接矩阵、邻接表)
目录一、图的邻接矩阵存储结构总代码二、网图的邻接矩阵存储结构总代码三、图的邻接表存储结构总代码四、网图的邻接表存储结构总代码一、图的邻接矩阵存储结构顶点数组:存储顶点数据边数组:存储边数据typedef struct{ char vertex[MAXSIZE]; //顶点 int edge[MAXSIZE][MAXSIZE]; //邻接顶点 int vertexNum; //顶点数量}G...原创 2021-08-02 17:05:33 · 1158 阅读 · 0 评论 -
数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)
目录一、单链表1、存储方式2、插入3、删除总代码:二、静态链表1、存储方式2、插入3、删除4、遍历总代码:三、循环链表总代码:四、双向循环链表1、存储方式:2、插入和删除3、正向遍历与反向遍历总代码:一、单链表每个数据存储在结点中,单链表负责把这些结点串起来。(主要利用*next指针)1、存储方式从根结点开始(根结点可以不存储元素),用*next指针指向后面元素的地址,后面元素的*next继续指向更后面的元素...原创 2021-08-01 15:54:59 · 392 阅读 · 0 评论 -
数据结构与算法(6-4)线索二叉树
优势:便于在中序遍历下,查找前驱和后继。前驱/后继含义:AB中,A是B前驱,B是A后继。ltag=0时:lchild指向左孩子 ltag=1时:lchild指向前驱rtag=0时:rchild指向右孩子 rtag=1时:rchild指向后继过程:1、先前序遍历创建二叉树2、线索化二叉树3、线索二叉树中序遍历输出总代码://线索二叉树//优势:便于在中序遍历下,查找前驱和后继#include<st...原创 2021-08-02 15:20:50 · 157 阅读 · 0 评论 -
数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)
目录一、顺序栈存储结构总代码二、两栈共享空间存储结构:总代码:三、链栈存储结构:总代码:一、顺序栈存储结构:栈:先进后出,后进先出。(特殊的线性表)入栈时在栈顶添加元素,出栈时在栈顶删除元素。(无论进出都始终在栈顶进行操作)总代码://顺序栈//先进先出,入栈时在栈顶加入元素,出栈时在栈顶删除元素(主要是s.top标志移动即可)#include <stdio.h>#define MAXSIZE 3int i =...原创 2021-08-01 16:38:25 · 276 阅读 · 0 评论 -
数据结构与算法(6-1)树的存储(树的双亲表示、树的孩子表示及树的双亲孩子表示)
一、树的双亲表示存储结构采用结构体数组的形式存储数据。(根结点parent=1:它没有双亲结点了)//树的双亲表示typedef struct{ char data; //结点数据 int parent; //双亲在数组中的位置}Tree;Tree tree[MAXSIZE];总代码//树的双亲表示法(双亲树)//getchar():吸收换行符#include<stdio.h>#define MAXSIZE 20int cou...原创 2021-08-02 10:20:02 · 1326 阅读 · 0 评论