数据结构
文章平均质量分 81
C语言;参考教材:严蔚敏数据结构第二版
Attract1206
算法/数据结构/密码学
展开
-
C语言-平衡二叉树(AVL Tree)
什么叫平衡二叉树为什么要平衡二叉树?如何判断失衡情况(RR、LL、RL、LR)平衡二叉树的四种情况?失衡:失衡树:失衡子树:RR型:整颗失衡树向左旋转一个单位LL型:整颗失衡树向右旋转一个单位RL型:失衡子树先向右旋转,再将整颗失衡树向左移动一个单位LR型:失衡子树向左旋转,再将整颗失衡树向右旋转一个单位如何用代码实现...原创 2020-08-16 13:35:06 · 519 阅读 · 0 评论 -
C语言-选择排序(Selection Sort)
1.简单选择排序(Simple Selection Sort)2.升级版:树形选择排序(Tree Selection Sort)3.再升级:堆排序(HeapSort)原创 2020-08-26 20:53:34 · 1943 阅读 · 0 评论 -
哈希查找/散列查找(HashSearch)
哈希表/散列表:1.什么是哈希表:哈希表不同于线性表数表之处在于其查找关键字(key)时不需要遍历表,哈希表中的每一个元素都可以根据元素值计算出其存放的地址,从而达到查找时长为O(1)。这就好比" 字典",我们查找字典中的某个关键字(key)时,只需要查找目录即可找到该关键字(key)存放的页码(位置/地址),而查找的目录是有限的,且是线性的(常数阶/线性阶),所以无论字典存放的元素、关键字再多,我们也能通过目录快速定位查找到某个元素。python中的 “字典(dict)” 就是如此,利用哈希表的原创 2020-08-22 21:02:39 · 10846 阅读 · 0 评论 -
C语言-交换排序(Swap Sort)
1.冒泡排序(Bubble Sort):void BubbleSort(int *r){ int i,j; for(i=0;i<Maxsize;i++) for(j=1;j<Maxsize-i;j++) if(r[j-1]>r[j]) Swap(r[j-1],r[j]);} 2.升级版冒泡排序://冒泡排序2void BubbleSort2(int *r){ int j,k; Bool flag;原创 2020-08-23 13:49:02 · 5675 阅读 · 4 评论 -
C语言-插入排序(Insertion Sort)
1.直接插入排序(Straight Insertion Sort):void InsertSort(int *r){ int i,j; for(i=2;i<Maxsize;i++)//r[0]是哨兵,存放当前的插入元素 {/*当元素r[i]比 有序集合r[1]~r[i-1] 中最后一个元素(也是最大的元素) r[i-1]还小时(即r[i]<r[i-1]),满足插入条件, 否则跳过该元素,执行 i++,继续向后寻找合适的插入元素 */ if(r[i]<r原创 2020-08-23 13:48:30 · 2008 阅读 · 0 评论 -
C语言-树表的查找(二叉排序树)
二叉排序树的搜索(SearchBST)二叉排序树的插入(InsertBST)二叉排序树的删除(Delete)中序遍历(inorder)先序遍历(preorder)什么是二叉排序树1.二叉排序树要么是空二叉树,要么具有如下特点:如果结点有左孩子,那么左孩子的值小于根结点的值如果结点有右孩子,那么右孩子的值大于根结点的值二叉排序树中的任意一个结点均满上述两点对二叉排序树执行中序遍历得到的是一组由小到大排好的元素序列二叉排序树有何特点二叉排序树的结构类似于二分查找的判定树。.原创 2020-07-24 13:00:06 · 2354 阅读 · 0 评论 -
C语言-线性表的查找(Linear Table Search)
查找静态查找:只找不改动态查找:边找边改无序查找:顺序查找有序查找:折半查找分块查找哈希表?原创 2020-07-23 22:11:23 · 2188 阅读 · 0 评论 -
C语言-AOE网与关键路径
1. 顶点下标查找函数(LocateVex)2. 创建有向网的邻接表(CreateDN)3. 邻接表打印函数(print)4. 拓扑排序(TopologicalSort)5. 关键路径(CriticalPath)原创 2020-07-16 15:54:56 · 4002 阅读 · 2 评论 -
C语言-AOV网与拓扑排序
什么是拓扑排序?如何用数组和假指针实现栈/队列完整源代码:#include <stdio.h>#include <stdlib.h>#define VertexType char //顶点的数据类型(char) #define VertexMax 20 //最大顶点个数 typedef struct ArcNode//边表 { int adjvex;//存储的是该顶点在顶点数组即AdjList[]中的位置 struct ArcNode *next...原创 2020-07-09 19:36:32 · 1884 阅读 · 2 评论 -
C语言-最短路径(Floyd算法)
1. 顶点下标查找函数(LocateVex)2. 创建有向网(CreateDN)3. 打印图函数(print)4. 弗洛伊德算法(ShortestPath_Floyd)5. 展示最短路径(DisplayPath)原创 2020-07-02 15:38:49 · 8332 阅读 · 3 评论 -
C语言-最短路径(Dijskra算法)
1. 顶点下标查找函数(LocateVex)2. 创建有向网(CreateDN)3. 打印图函数(print)4. 展示最短路径函数(displayPath)5. 查找当前最短路径函数(FindMinDist)6. 迪杰斯特拉算法(ShortestPath_Dijkstra)原创 2020-06-18 18:51:07 · 16830 阅读 · 5 评论 -
C语言-最小生成树(Kruskal算法)
创建边集图(CreateEdgeGraph)打印图(print)排序函数(sort)顶点下标查找函数(LocateVex)查找双亲函数(FindRoot)克鲁斯卡尔算法(MiniSpanTree_Kruskal)克鲁斯卡尔算法简单的来说就是:每次选取最短边,但不能构成回路。克鲁斯卡尔算法的关键用那种方式存储图才合适?如果用邻接矩阵和邻接表,每次寻找最短边都要搜索所有边,故邻接矩阵和邻接表均不合适!改进图的存储:边集数组。EdgeGraph中包含了两个数组和顶点数、边.原创 2020-06-13 10:19:25 · 12204 阅读 · 4 评论 -
C语言-最小生成树(Prim算法)
最小代价生成树最小生成树算法:普里姆算法(Prim):对顶点克鲁斯卡尔算法(Kruskal):对边普里姆算法:原创 2020-06-09 19:17:20 · 26158 阅读 · 9 评论 -
C语言-广度优先遍历
图的基本操作查找函数(LocateVex查找坐标)构建无向图(Undirected Graph)输出邻接矩阵(print)循环队列基本操作入队(EnQueue)出队(DeQueue)判断队是否为空(QueueEmpty)广度优先遍历:广度优先查找(BFS)广度优先遍历(BFSTraverse)广度优先遍历基本步骤设置全局变量visited数组并初始化为全0,代表所有节点均未被访问设置起始点:包括对起始点进行输出、标记成已访问、入队对后续结点进行操作:由起.原创 2020-06-04 19:37:23 · 14447 阅读 · 12 评论 -
C语言-深度优先遍历
查找函数(LocateVex查找坐标)构建无向图(Undirected Graph)输出邻接矩阵(print)深度优先查找函数(DFS)深度优先遍历(DFSTraverse)完整源代码:注:图的遍历算法在任何图与网中都适用,此处仅用无向图UDG进行演示!邻接矩阵的深度优先遍历#include <stdio.h>#include <stdlib.h>#define VertexMax 100 //最大顶点数为100typedef char VertexT.原创 2020-06-04 14:56:00 · 23547 阅读 · 2 评论 -
C语言-图的存储结构(邻接表)
查找函数(LocateVex查找坐标)构建有向图(Directed Graph)构建无向图(Undirected Graph)图的类型选择函数(GraphChoice)输出邻接矩阵(print)#include <stdio.h>#include <stdlib.h>#define VertexType char //顶点的数据类型(char) #define VertexMax 20 //最大顶点个数 typedef struct ArcNode//边表 .原创 2020-05-29 21:16:15 · 5305 阅读 · 4 评论 -
C语言-图的存储结构(邻接矩阵)
查找函数(LocateVex查找坐标)构建有向图(Directed Graph)构建无向图(Undirected Graph)构建有向网(Directed Network)构建无向网(Undirected Network)图的类型选择函数(GraphChoice)输出邻接矩阵(print)完整源代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#define VertexMax .原创 2020-05-29 10:11:30 · 11930 阅读 · 9 评论 -
C语言-哈夫曼树、哈夫曼编码
哈夫曼树中的查找算法(Select)哈夫曼树的构建(HuffmanTree)哈夫曼编码的构建(HuffmanCoding)打印哈夫曼树表(Print)打印权值及其编码(Inputcode)完整代码:#include <stdio.h>#include <stdlib.h>#include <string.h> typedef struct{ int weight; int parent,rchild,lchild;}HTnode; vo.原创 2020-05-16 23:44:52 · 2976 阅读 · 4 评论 -
C语言-线索化二叉树(中序)
二叉树的创建及初始化线索化Next函数(根据线索找后继)Prior函数(根据线索找前驱)非递归中序遍历(根据线索遍历)为什么要将二叉树线索化?首先就是我们在建立二叉树的时候提到的存储空间浪费的问题,建立n个结点的二叉树,总共有2n个指针域(左右孩子),被浪费的足足有n+1的节点是空节点,我们怎么能利用上这些空间呢?还有一个问题是,在创建二叉树的时候,大部分算法都是用递归实现,实现起来简单,然而系统运行起来却很吃力,很占用系统资源。当我们在建立好二叉树之后我们需要频繁的查找某个单元,就得频.原创 2020-05-10 23:08:18 · 4803 阅读 · 8 评论 -
C语言-二叉树的基本操作(test)
创建二叉树节点(递归)先序遍历(递归)中序遍历(递归)后序遍历(递归)完整代码:#include <stdio.h>#include <stdlib.h>typedef char dataType;typedef struct BiNode{ dataType elem; //根节点的元素值 struct BiNode *lchild; //...原创 2020-05-05 17:22:33 · 1076 阅读 · 2 评论 -
C语言-模式匹配(KMP算法)
什么是KMP算法?KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,简称KMP算法。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法与BF(暴力破解法)的区别KMP算法是建立在BF算法基础上的,KMP算法...原创 2020-04-22 21:17:37 · 15820 阅读 · 5 评论 -
C语言-模式匹配(BF算法)
**算法思路:**暴力破解法,“主串S”与“模式串T”逐位匹配,匹配相同则下一位,匹配相异则回溯。#include <stdio.h>#include <string.h>#define maxsize 100int Index_BF(char S[],char T[]){ int i=0,j=0; while(S[i]!='\0'&&T[j...原创 2020-04-20 17:45:09 · 1012 阅读 · 0 评论 -
C语言-用栈实现表达式求值(顺序栈)
函数目录:栈的基本操作:创建栈并初始化(create)入栈(push_in)出栈(pop_out)取栈顶元素(GetTop)优先级函数(Precede)求值函数(Operate)判断操作符函数(In)表达式求值函数(evaluateExpression)其他:操作符栈(OPTR),操作数栈(OPND)谈谈我遇到的问题:1.该选择数字栈还是字符栈?运算数是整型...原创 2020-04-16 22:34:37 · 34073 阅读 · 38 评论 -
C语言-链队列的基本操作(test)
创建头结点,初始化。入队。出队。取队头元素。遍历。注:1.根据队列的入队,出队规则,设置头结点便于实现出队操作;2.头指针front始终指向头结点,尾指针rear指向队列最后一个元素,length用于记录队列中元素个数,遍历操作会用到length。#include <stdio.h>#include <stdlib.h>typedef int da...原创 2020-04-11 19:14:07 · 546 阅读 · 0 评论 -
C语言-循环队列的基本操作(test)
1.创建循环队列并初始化。2.入队。3.出队。4.取对头元素。为什么我们要使用循环队列?1.普通顺序队列:在使用普通顺序队列的时,判断队空的操作是rear==front,判断队满的操作是判断rear是否在队列尾部我们不难发现当图(b)与图 (d) 所示情况出现时,rear都处于队列尾部,即程序都将判断队列已满,但是图(d)显然有空,即会出现“真溢出”和“假溢出”的问题。2.为了解决...原创 2020-04-08 12:43:38 · 1531 阅读 · 0 评论 -
C语言-链栈的基本操作(Clean)
1.初始化2.入栈3.出栈(出栈元素部分未完成)4.取栈顶元素(未完成)5.栈的遍历及输出注:1.链栈不需要设置头结点,由于链栈的插入和删除元素都在只能在栈顶 操作。2.栈分外部结构和内部结构,外部结构是指栈顶指针top;内部结构是指栈的结点环环相扣,链栈的内部结构类似于单链表但,next的指向方向不同,链栈是由栈顶指向栈底,即从后往前指,而单链表是从前往后指,注意区别!...原创 2020-04-06 22:26:53 · 1259 阅读 · 2 评论 -
C语言-顺序栈的基本操作(Clean)
1.创建顺序栈并初始化2.入栈3.出栈4.取栈顶元素#include <stdio.h>#include <stdlib.h>#define M 10typedef int dataType; typedef struct Stack{ dataType *top; dataType *base; int stacksize;}sqstack;...原创 2020-04-06 21:59:24 · 672 阅读 · 2 评论 -
C语言-顺序表、单链表基本操作(Clean)
单链表基本操作目录:1.创建头结点2.链表元素查找3.插入节点4.删除节点5.头插法6.尾插法7.排序(起泡法排序)8.打印链表#include<stdio.h>#include<stdlib.h>typedef struct node{ int data; int Node; struct node *next;}Linklist;...原创 2020-03-23 17:38:52 · 861 阅读 · 3 评论