![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
数据结构
smile_keep looking
ok
展开
-
数据结构期末急救版本
内容多,要记忆的点也很多。期末复习应该是一场硬仗。原创 2023-12-27 13:18:37 · 413 阅读 · 0 评论 -
图的遍历算法--DFS,BFS--12月8日
一、DFS传入数组的位置v表示数组的位置,初始点的位置 ,调用的时候传入。原创 2021-12-08 15:49:39 · 36 阅读 · 0 评论 -
数据结构—— 第四章串+第六章图(关键路径)
KMP算法的作用是在一个已知字符串中查找子串的位置,也叫做串的模式匹配。字符串的匹配: 暴力就是一个一个匹配,一发现错误,马上回退到开头的下一个,但是这样会比较慢。让后移动的位数增加,减少一些不必要的判断。原创 2023-04-13 23:38:35 · 31 阅读 · 0 评论 -
最大堆------2022年1月5日
和最小堆相比,只是比较条件改变,其他不变,思路一样#include <iostream>#include <cassert>using namespace std;const int DefaultSize = 1;//最小堆有线性表的结构//有头,顺序存储有搜索便捷的优点,直接根据下标。template <class T, class E>class MaxHeap{// T为关键码的数据类型,E为记录的结构类型public: MaxHeap(in原创 2022-01-05 16:15:18 · 82 阅读 · 0 评论 -
稀疏矩阵、广义表、串------2022年1月4日--最后一节课
开始之前需要知道一下,矩阵的元素的地址位置怎么找。归纳一下加入已知首地址是 A求 A[i]的位置 : A+ i*l ;LOC(i)=LOC(i-1)+ l;以三维数组为例:三角矩阵的存储用一维数组存储三角矩阵的上半部分(或者下半部分)。这里的计算公式需要掌握对称矩阵的存储稀疏矩阵顾名思义: 就是很少元素的矩阵。面对这样的矩阵,我们需要用另一种方式存储,不需要直接用二维数组存储三元表用三元表存储就是: 记录行号、列号、 以及总共的元素个数。比如以下矩阵:用新的方式存原创 2022-01-04 15:49:26 · 695 阅读 · 0 评论 -
排序合集---2021年12月22日
写出以单链表做存储结构的直接插入排序算法。直接插入排序是:从第二个元素开始,往前找,找到合适的位置插入。这里插入要注意:对于数组来说,插入要把这个整个范围的数往后移动,得到结果。对于链表来说,不需要移动结点,只需要交换值即可。数组的写法:开始的0位置 空出。存放暂时值//直接插入排序void Seqlist<T>::InsertSort(){ int i = 0, j = 0; for (i = 2; i <= last; i++) { data[0]原创 2021-12-22 22:24:22 · 343 阅读 · 0 评论 -
AOV网络(有向图)----拓扑排序--判断有无环的问题--12月18日
AOV网络用顶点表示活动的网络用有向图表示先修和后修的关系。在有向图中,用顶点表示活动,用有向边< vi, vj >表示vi 必须先于 v j进行。如果有有向环则说明某项活动以自己为先决条件,这是不对的。图中明显没有环。可以看到输出的顺序。排序(这里不是按大小排)例如: 课程应该先修哪一个门课。比如数据结构这门课的先修课是C++语言高等数学。这样按照顺序排序然后输出,就可以知道怎么修读课程。上图的修读顺序是F 、D、 C、A 、 B步骤如下:输入AOV网原创 2021-12-18 19:50:34 · 656 阅读 · 0 评论 -
最短路径法---Dijkstra---迪杰斯特拉算法---图
找最短生成路径但是注意到,邻接矩阵的主对角线可以作为访问数组就只需要一个距离值表即可为了输出路径,加一个path数组这里的path数组类似并查集可以直接找到自己的父节点。下标存该节点的位置。数组的值存(仅一层)父节点的位置。第一步: 找到最短的路径(可以直接到达),记录位置和到该点的距离第二步:找到该点之后,标记已找到,找该点到达其他(未走过的)点的最短路径,找到则更新位置,并记录中转结点。template <class T, class E>void Graphmtx&原创 2021-12-17 22:24:14 · 953 阅读 · 0 评论 -
prime算法---普林姆算法---12月16日
prime算法从端点入手每一次选一个端点放入生成树中,(保证没有回路,即该点之前没有加入到生成树中)若把点加入到生成树中,则需要标记该邻接矩阵的对角线为1.如果所有的对角线都为1, 则生成完毕。这里可以用一个计数器来记录。1.找所有与u邻接的点,存入权值到最小堆。2.选一个v点与u点连接最小3.直到所有点被遍历过minspantree.h#include"Graphms.h"#include"UFsets.h"#include"Queue.h"#include &l原创 2021-12-16 16:11:38 · 624 阅读 · 0 评论 -
并查集---------2021年12月15日
并查集 实现两个集合合并,并且好找父节点这里设计一个方法,那其中一个根结点作为另一个树的子结点操作总结:初始化初始化并查集这里把所有结点的父节点都为-1 ,父节点用数组值表示,子节点用下标表示UFSets::UFSets(int sz) { size = sz; parent = new int[size]; //创建双亲数组 for (int i = 0; i < size; i++) { parent[i] = -1; }}原创 2021-12-15 20:08:23 · 800 阅读 · 0 评论 -
最小生成树----Kruscal算法(从边入手找顶点)
#include"Graph.h"#include"UFsets.h"#include"Queue.h"#include <iostream>const double maxValue = 99999999.0; //机器可表示的、问题中不可能出现的大数const int DefaultSize2 = 50;//最小生成树边结点的类声明template <typename T, typename E>struct MSTEdgeNode {//T为顶点类型,其原创 2021-12-15 10:00:53 · 1253 阅读 · 0 评论 -
无向图的邻接表形式--DFS+BFS(前序+层次遍历)
邻接表//图的邻接表结构const int DefaultVertices = 30;//默认最大顶点数//边结点,下一个顶点的位置template<class T,class E>//T为顶点名字struct Edge { int dest; //边的另一个顶点的位置 E cost; //边上的权值 Edge<T, E>* link; //这个点的下一条边 Edge() { dest = -1; cost = 0; lin原创 2021-12-14 20:53:41 · 288 阅读 · 0 评论 -
图--建立----12月8日
图1.表示用邻接矩阵表示:带权的图用无穷大初始化矩阵—意思:顶点不可到达,但是自己可以到达自己,距离是0 。不带权的图用0 就可以。上面的查找顶点用散列改进比较好。邻接矩阵的用法:无向图:邻接表:这里默认A,B,C,D都是起点与其他点邻接,则拓展一个单链表。### 二、有向图的邻接表这里是分为正向和逆向的邻接表### 三、网络带权图的连接表这里讲第三种的具体代码实现第一步:1.构建结点( 存相邻的结点 (包括位置下标 , 权重 , 指针域 ) )2.原创 2021-12-08 15:04:31 · 67 阅读 · 0 评论 -
无向图的邻接矩阵实现--12月8日--12月29日改
#ifndef Graphmtx_H#define Graphmtx_H#include "Graph.h"#include <iostream>using namespace std;extern const int maxWeight;const int maxSize = 100;//邻接矩阵存储的图的类定义(无向图)template <class T, class E>class Graphmtx : public Graph<T,E>原创 2021-12-08 14:28:23 · 250 阅读 · 0 评论 -
哈夫曼树---建立操作
这里演示建树过程: 左小,右大。思路:找到最小和次小,合并形成一个新的父节点,(所以一个结点有三个指针域)从叶子往上建树的过程。所以关键是:1.找到最小和次小, 2. 合并下面展示过程代码:template <typename T, typename E>//一个结点自带三个指针struct HuffmanNode { E data; HuffmanNode<T, E>* leftChild, * righ...原创 2021-12-04 10:23:38 · 129 阅读 · 0 评论 -
循环队列----链式队列-双端队列---复习
解决该问题循环队列顺序存储#pragma once#include<iostream>using namespace std;//循环队列template <class T>class SeqQueue {protected: int rear, front; //队尾和队头指针 T* elements; int maxSize;public: SeqQueue() { maxSize = 100; elements = new T[maxSize原创 2021-11-24 22:19:12 · 103 阅读 · 0 评论 -
二叉树的各种操作------2021年11月24日
1.二叉树的创建*可以建立一颗不完全的二叉树 //创建 //广义表的方式 A(B(D,E),Q)# void CreatBinTree( BinTreeNode<T>*& bt) { Refvalue = '#'; Stack<BinTreeNode<char>*> s; bt = NULL; //把树置空 BinTreeNode<T>* p=bt, * t; int k; char ch; cin >&g原创 2021-11-24 17:47:35 · 533 阅读 · 0 评论 -
DFS + BFS + 洛谷题
DFS经典的迷宫问题( 回溯 问题 )在起点处有四个方向,上下左右,走到终点之后,要再返回,看有没有其他更短的路径。回溯过程,退回之后,要标记该点的值为没有访问过。直到找到最短的路径。左右试探的图解位置变化以下是未经优化的代码。(dfs)#include <iostream>#include <unordered_map>using namespace std;int p, q; //终点坐标,(P,q)int a[100][100]; //1表示空地,原创 2021-10-09 17:20:59 · 488 阅读 · 0 评论 -
数据结构--------最大堆最小堆
#include <iostream>#include <cassert>using namespace std;const int DefaultSize = 1;//最小堆有线性表的结构//有头,顺序存储有搜索便捷的优点,直接根据下标。template <class T ,class E> class MinHeap{// T为关键码的数据类型,E为记录的结构类型public: MinHeap(int sz)//构造函数:建立空堆 { max原创 2021-11-06 12:56:09 · 126 阅读 · 0 评论 -
二叉树总结与应用
//关于队列的“queue.h”#pragma once#include<iostream>using namespace std;//循环队列template <class T>class SeqQueue {protected: int rear, front; //队尾和队头指针 T* elements; int maxSize;public: SeqQueue() { maxSize = 100; elements = new T[maxSi原创 2021-10-29 17:37:54 · 28 阅读 · 0 评论 -
unordered_map
矩阵赋值问题#include #include <unordered_map>using namespace std;int tr[10005], tc[10005]; //tr[i]=10记第i行最后一次修改值为10,tc记列。typedef pair<int, int > PII;unordered_map<int, PII>hang;unordered_map<int, PII>lie;int n, m,q;int main(){i原创 2021-10-09 11:09:38 · 151 阅读 · 0 评论 -
队列、循环队列、链式队列-------c++
#include<iostream>using namespace std;template <class T>class SeqQueue {protected : int rear, front; //队尾和队头指针 T* elements; int maxSize;public: SeqQueue(int sz); ~SeqQueue() { delete[]elements; } bool EnQueue(const T& x); bool.原创 2021-10-16 22:44:45 · 42 阅读 · 0 评论 -
表达式的计算--栈
这里的蓝色符号表示运算符栈中当前存的字符,紫色表示表达式里的字符。mysteck.h#pragma once#include <iostream>using namespace std;template<class T>class Stack{private: T* element; int top; int maxSize; void overflowProcess(); //栈的溢出处理public: Stack(int sz = 50); .原创 2021-10-20 21:40:28 · 26 阅读 · 0 评论 -
栈与递归----链表与递归(2021年10月13日)
函数的嵌套调用可以再清晰一点看如何写递归函数第一步: 找到基本项(即终止条件)递归的结束位置。如果没有结束条件,则会出现运行栈满的情况。溢出第二步: 归纳项(改变规模,类似套娃)以下涉及几个递归案例1.尾插法建链、递归2.求表长3.链表输出4.链表逆置#include <iostream>using namespace std;struct Node{ int data; Node* link;};//尾插法建链、递归Node* create(int原创 2021-10-13 13:22:06 · 60 阅读 · 0 评论 -
链栈----初始化
#include <iostream>using namespace std;template<class T>struct stacknode{private: T data; stacknode<T>* link;public: stacknode(T d = 0, stacknode<T>* next = NULL) :data(d), link(next) {};};template<class T>class li原创 2021-10-09 11:45:37 · 741 阅读 · 0 评论 -
栈--初,用栈判断对称字符串
栈判断对称字符串这里分奇和偶数讨论#include <iostream>using namespace std;template<class T>class Stack{private: T* element; int top; int maxSize; void overflowProcess(); //栈的溢出处理public: Stack(int sz = 50); ~Stack(); void Push(T x); bool Pop(T&a原创 2021-10-09 00:06:03 · 212 阅读 · 0 评论 -
顺序栈---以及其应用
#include <iostream>using namespace std;template<class T>class Stack{private: T* element; int top; int maxSize; void overflowProcess(); //栈的溢出处理public: Stack(int sz=50); ~Stack(); void Push(T x); bool Pop(T &x); bool getTop原创 2021-10-08 19:16:45 · 79 阅读 · 0 评论 -
双向循环链表(带头结点)
#include <iostream>using namespace std;struct DblNode{ int data; DblNode* llink; DblNode* rlink;};template<class T>class DblList {public: DblList() { first = new DblNode; first->rlink = first->llink=first; length = 0;原创 2021-10-05 13:46:26 · 121 阅读 · 0 评论 -
链表的逆置
#include using namespace std;struct Node{Node* link;int data;};int main(){Node* first = new Node;Node* tail = first,*p=NULL,*q=NULL;int m = 3;while (m != 0){p = new Node;p->data = m;tail->link = p;tail = p;cin >> m;}tail->原创 2021-10-05 14:21:57 · 202 阅读 · 0 评论 -
数据结构--链表
单链表1.头插法template <class T>struct LinkNode { T data;//数据 LinkNode<T>* next;};//创建单链表不带头结点,前插法(顺序与输入相反)template <class T>LinkNode<T>* create0(T N) { LinkNode<T>* head=NULL,*p=NULL; for (int i = 0; i < N; i++) {原创 2021-09-29 21:43:32 · 83 阅读 · 0 评论