数据结构
飘满红楼
勿在浮沙筑高台,不为繁华易匠心
展开
-
二叉树树的四种遍历方式的非递归算法
先序遍历#include <stdio.h>#define MAX 100typedef struct Node{ int data; struct Node * lchild; struct Node * rchild;}BTNode;// 先序遍历非递归算法void preorder(BTNode * b){ // 创建指针数组栈 BTNode * st[MAX]; // 工作指针 BTNode * p; // 栈顶 int top = -1;原创 2020-06-09 22:12:49 · 248 阅读 · 0 评论 -
kmp算法
数据结构-字符串匹配算法(kmp算法基于next数组)#include<stdio.h>#define MAX 100// kmp算法// s为文本串指针,t为模式串指针int kmp(char * s, char * t){ int i = 1, j = 1; // next数组,之和模式串有关 int next[MAX]; // 根据模式串生成next数组,即保留最近一次可以回退的位置 getNext(t, next); while(i < strlen(原创 2020-06-09 21:37:28 · 141 阅读 · 0 评论 -
头插法和尾插法
数组创建单链表的两种方法#include<stdio.h>#include<malloc.h>typedef struct LNode{ // 假设是整型 int data; struct LNode * next;}Linklist;// 头插法创建链表,时间复杂度O(n)// L为头指针,a[]为待转变成链表的数组void createListHead(Linklist * L, int a[], int n){ // 用于生成新节点; Lin原创 2020-06-09 21:34:19 · 1837 阅读 · 0 评论 -
哈夫曼树的构造
#define MaxSize 1000#define INT_MAX 0x7ffffffftypedef struct { // 节点权值 int weight; // 节点双亲 int parent; // 节点左孩子 int lchild; // 节点右孩子 int rchild;}HNodeType;// 构造霍夫曼树HNodeType * huffmanTree(){ // 定义哈夫曼节点 HNodeType HuffNode[MaxSize]; i...原创 2020-06-07 22:45:46 · 227 阅读 · 0 评论 -
拓扑排序(容易理解版)
当顶点结构体中的成员变量count存放顶点的出度值时,为逆拓扑排序,为无环时的深度优先遍历时间复杂度O(n+e)#define MaxSize 1000 // 边节点typedef struct ANode{ // 边所指的终点顶点 int adjvex; // 边的终端节点,邻域,指向下一个邻接点 struct ANode * nextarc; // 权值 int weight;}ArcNode; // 顶点typedef struct Vnode{ // 数据域原创 2020-06-07 22:23:26 · 340 阅读 · 0 评论 -
Floyd算法
Floyd算法 时间复杂度O(n3)#define MaxSize 1000#define INT_MAX 0x7ffffffftypedef struct{ // 邻接矩阵 int edges[MaxSize][MaxSize]; // 图中顶点个数 int n;}Graph;// Floyd算法void Floyd(Graph g){ // 距离矩阵和路径矩阵 int dist[MaxSize][MaxSize]; int path[MaxSize][MaxSize原创 2020-06-07 22:05:37 · 126 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法#define MaxSize 1000#define INT_MAX 0x7ffffffftypedef struct{ // 邻接矩阵 int edges[MaxSize][MaxSize]; // 图中顶点个数 int n;}Graph;// 求所有顶点到顶点v的最短路径void Dijkstra(Graph g, int v){ // 距离矩阵 int dist[MaxSize]; // 路径矩阵 int path[MaxSize]; /原创 2020-06-07 21:55:09 · 170 阅读 · 0 评论 -
kruskal算法,简单易懂
kruskal算法,基于并查集的实现#define MaxSize 1000typedef struct{ // 边的起点和终点序号 int front, to; // 权值 int weight;}EdgeType;// 边图结构体类typedef struct{ // 顶点集 int vertex[MaxSize]; // 边集 EdgeType edge[MaxSize] // 顶点个数 int vertexnum; // 边个数 int edgenum;原创 2020-06-07 21:38:39 · 359 阅读 · 0 评论 -
prim最小生成树 C++实现
prim最小生成树#define MaxSize 1000#define INT_MAX 0x7ffffffftypedef struct{ // 邻接矩阵 int edges[MaxSize][MaxSize]; // 图中顶点个数 int n;}Graph;// 时间复杂度为O(n2),与图的边数无关,适合稠密图void prim(Graph g, int v){ // 存储出发顶点到其他顶点的权值 int lowcost[MaxSize]; // 中间变量,用于原创 2020-06-07 21:21:39 · 145 阅读 · 0 评论 -
图的深度优先遍历的递归和非递归算法 C++实现
#define MaxSize 1000 // 边节点typedef struct ANode{ // 边所指的终点顶点 int adjvex; // 边的终端节点,邻域,指向下一个邻接点 struct ANode * nextarc; // 权值 int weight;}ArcNode; // 顶点typedef struct Vnode{ // 数据域 int data; // 指向的第一条边 ArcNode * firstarc;}VNode; // 邻.原创 2020-06-07 21:00:34 · 1543 阅读 · 3 评论 -
BFS 基于C++的实现
图的广度优先遍历算法#define MaxSize 1000// 边节点typedef struct ANode{ // 边所指的终点顶点 int adjvex; // 下一条边,邻域,指向下一个邻接点 struct ANode * nextarc; // 权值 int weight;}ArcNode;// 顶点typedef struct Vnode{ // 数据域 int data; // 指向的第一条边 ArcNode * firstarc;}VNode原创 2020-06-07 20:38:34 · 915 阅读 · 0 评论 -
递归和回溯两种方法解决全排列问题
public List<List<Integer>> permute(int[] nums) { return permuteMain(nums, nums.length); } // 采用递归,自顶而下 private List<List<Integer>> permuteMain(int[] nums, int len) { if(len == 0){ return...原创 2020-05-25 20:47:52 · 144 阅读 · 0 评论 -
不带头结点的单链表逆置问题
经常能被单链表逆置给绕进去,此时把个人解释和代码放出,方便记忆 /** * 反转链表 * 迭代实现 * @param p * @return */ private ListNode reverseListByIter(ListNode p){ if(p == null || p.next == null){ return p; } // work为工作指针,跟随p的变原创 2020-05-25 20:15:28 · 2555 阅读 · 0 评论