数据结构与算法C++
文章平均质量分 82
常用数据结构算法C++实现
CodePanda@GPF
分享Java、算法等知识,欢迎热爱编程的朋友一起交流!
展开
-
C++ STL容器---vector常用方法介绍
C++ STL容器---vector常用方法介绍原创 2022-10-24 09:58:32 · 335 阅读 · 0 评论 -
C++STL容器---string常用方法介绍
C++STL容器---string常用方法介绍原创 2022-10-23 10:44:26 · 643 阅读 · 0 评论 -
最短路径算法----Floyd算法
#include<stdio.h>#include<stdlib.h>typedef int VertexType;//顶点类型typedef int EdgeType;#define MAXVEX 100//最大顶点数#define MAXEDGE 200//最大边数#define INFINITY 65535//代表无穷大,两个顶点之间不可达int visited[MAXVEX];//访问标志的数组typedef struct{ VertexType v原创 2020-07-30 20:15:45 · 84 阅读 · 0 评论 -
单源最短路径-----Dijkstra算法
#include<stdio.h>#include<stdlib.h>typedef int VertexType;//顶点类型typedef int EdgeType;#define MAXVEX 100//最大顶点数#define MAXEDGE 200//最大边数#define INFINITY 65535//代表无穷大,两个顶点之间不可达int visited[MAXVEX];//访问标志的数组typedef struct{ VertexType v原创 2020-07-29 20:48:22 · 208 阅读 · 0 评论 -
最小生成树算法------Kruskal算法
与Prine算法不同,Kruskal算法是以边为目标去构建最小生成树的。刚开始令最小生成树的初始状态使用n个顶点而无边的非连通图T。然后每次选择最小的边,如果改边依附的顶点落在T中的不同的连通分量上,则将此条边加入到T中,否则舍去这条边然后去选择下一条代价最小的边。时间复杂度为e(loge)#include<stdio.h>#include<stdlib.h>typedef int VertexType;//顶点类型typedef int EdgeType;#define原创 2020-07-27 20:30:56 · 111 阅读 · 0 评论 -
最小生成树算法------Prim算法
思想:以某顶点为起点,逐步找各个顶点上权值最小的边来构建最小生成树。最小生成树含有图中的n个顶点,n-1条边以含有9个顶点的图举例,顶点依次记录为0 1 2 3 …9不妨以0结点为开始结点,初始时将0结点加入最小生成树第一次:在与0结点相连的结点里面选一个权值最小的边,然后将该相邻结点加入最小生成树,不妨设该结点为1第二次:在与0 1结点相邻的结点里面寻找最小权值的边,找到后将该相邻结点加入最小生成树,不妨设该结点为2第三次:在与0 1 2结点相邻的结点里面寻找最小权值的边…具体实现:两个重原创 2020-07-25 21:11:34 · 163 阅读 · 0 评论 -
图搜索之BFS
BFS类似于树的层次遍历,采用队列实现,先将第一个结点加入队列,当这个结点出队时,将与该结点相连的结点入队…依次类推,将出队的结点构成一个序列,该序列就是广度优先遍历的顺序。#include<iostream>using namespace std;#include<stdio.h>#include<stdlib.h>#include<queue>typedef char VertexType;//顶点类型typedef int EdgeTyp原创 2020-07-24 19:34:43 · 188 阅读 · 0 评论 -
图搜索之DFS
#include<stdio.h>#include<stdlib.h>typedef int VertexType;//顶点类型typedef int EdgeType;#define MAXVEX 100//最大顶点数#define INFINITY 65535//代表无穷大,两个顶点之间不可达int visited[MAXVEX];//访问标志的数组typedef struct{ VertexType vexs[MAXVEX];//顶点表 Edge原创 2020-07-23 19:27:29 · 131 阅读 · 0 评论 -
二叉树的创建以及三种遍历方式
按先序遍历的序列从创建一个二叉树,当然你也可以按中序,后序序列来创建二叉树,当一个结点的左孩子或右孩子为空时,用#d代替该结点。#include<stdio.h>#include<stdlib.h>typedef struct BiTNode//结点结构{ char data;//结点数据 struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;void CreateBiTree(BiTree *T){ .原创 2020-07-15 12:59:42 · 438 阅读 · 0 评论 -
串的匹配算法KMP及改进
KMP模式匹配算法#include<stdio.h>#define MAXSIZE 255typedef unsigned char SString[MAXSIZE+1];//0号单元存放串的长度void get_next(SString s,int next[]){ int i,j; next[1]=0;//特殊情况i=1; i=1; j=0; while(i<s[0]) { if(j==0)原创 2020-07-13 14:55:28 · 189 阅读 · 0 评论 -
串的基本操作
#include<stdio.h>#include<stdlib.h>typedef struct{ char *ch; int length;}HString;void Init(HString &S,char s[])//初始化一个串{ int s_length=0; for(int i=0;s[i]!='\0';i++) s_length++; S.ch=(char *)malloc(sizeof(ch原创 2020-07-12 11:48:47 · 159 阅读 · 0 评论 -
队列的链式实现
队列的链式存储结构实际上就是线性表的单链表,在这个基础上面加了只能尾进头出的限制。为了操作方便设置了一个头结点,头结点里面没有保存数据元素,然后设置了两个指针,front指向队列里面的头结点,其实在入队和出队过程中,front始终指向头结点,并没有发生改变。另外一个指针式rear,它初始时指向头结点,然后每入队一个元素,先使rear->next指向加入的结点,然后使rean=newnode,rear是移动的,每次都指向最后一个结点,在出队时如果是最后一个结点的话,还需要额外的一步操作,是rear指向h原创 2020-07-11 11:33:26 · 107 阅读 · 0 评论 -
循环队列
顺序存储的假溢出对于一个数组,由于每出队一个元素,队头指针front就会向前移动一个位置,当front移到某个位置时如果再进行入队操作的话(可以进行多次入队操作),就会发现数组后面的位置已满,而数组前面的位置却是空的情况,这种现象就叫做假溢出。循环队列队列初始为空时:使front=rear,front指向当前队头元素,rear指向队尾元素的下一个位置这会造成一个问题:当队满的时候front也等于rear,这会导致无法判断是空还是满。解决方案1加一个flag标志,flagrear且flag为0时-原创 2020-07-10 13:21:51 · 122 阅读 · 0 评论 -
栈的应用----将中缀表达式转为后缀表达式并计算
中缀表达式转后缀表达式对于一个中缀表达式串,对其进行扫描,若是数字字符则输出,若是第一个运算符号则将其入栈,然后继续扫描,如果当前扫描到的运算符号的优先级不大于栈顶运算符号的优先级,则将栈里面的运算符号全部pop并输出,然后将扫描到的符号push进去。当扫描到的是)时,则pop栈中的运算符号并输出直到遇到(,遇到(时将其弹出但是不输出。对此我的实现方法时给+ - * / ( )都给了一个优先级,()的优先级高于加减乘除,这样可以保证在遇到(时不会弹出栈中的符号而是将(入栈。后缀表达式的计算遇到数字则将原创 2020-07-09 16:16:41 · 351 阅读 · 0 评论 -
栈的顺序存储实现及链式存储实现
顺序存储实现#include <stdlib.h>#include <stdlib.h>#define size 100typedef int ElemType;typedef struct stack{ ElemType s[size]; int top;}stack;void Init(stack **S)//初始化{ *S=(stack *)malloc(sizeof(stack)); (*S)->top=0;}int原创 2020-07-09 11:21:17 · 270 阅读 · 0 评论 -
循环双向链表
#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct DuNode{ ElemType data; struct DuNode *prior;//直接前驱指针 struct DuNode *next;//直接后驱指针}DuNode, *DuLinkList;void Init(DuLinkList *L){ *L=(DuLinkList)mal原创 2020-07-08 14:15:38 · 555 阅读 · 0 评论 -
关于指针的malloc问题
在程序中常常会用到指针,指针要有一个明确的指向,一般情况下我们使用指针指向一个变量那么该指针指向的地址就是该变量的地址 int a=2; int *p; printf("p的地址:%p\n",p); p=&a; printf("a的地址:%p\n",&a); printf("p的地址:%p\n",p);可以看成这种情况下刚开始p指向一个随机地址,使用p=&a语句以后,p就指向了a的地址。这并没有涉及到malloc,下面我们来看一原创 2020-07-07 13:55:14 · 1105 阅读 · 0 评论 -
单向链表的头插法、尾插法以及插入、删除
#include<stdio.h>#include<stdlib.h>#define LIST_INIT_SIZE 100//定义线性表空间的初始存储大小为#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;typedef struct Node{ ElemType data;//数据域 struct N原创 2020-07-07 13:31:06 · 206 阅读 · 0 评论 -
线性表(顺序存储)的相关操作
#include<stdio.h>#include<stdlib.h>#define LIST_INIT_SIZE 100//定义线性表空间的初始存储大小为#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;typedef struct { ElemType *elem; int length;}Seq原创 2020-07-06 22:30:39 · 195 阅读 · 0 评论