数据结构(C语言实现)
总结浙江大学陈越老师和何钦铭老师在MOOC上的《数据结构》以及清华大学严蔚敏老师编著的《数据结构(C语言版)》中的算法代码实现
Mongo_girl
哈哈哈哈哈哈哈哈
展开
-
受限的双端队列
若以 1234 作为双端队列的输入序列,试分别求出满足以下条件的输出序列:(1) 能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列;答案:4132(2) 能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列;答案:4213(3) 既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列。答案:4231初见此题,感觉没有思路。看了答案之后...转载 2019-05-17 19:59:07 · 4234 阅读 · 1 评论 -
[Error] invalid initialization of non-const reference of type 'ElemType& {aka int&}' from an rvalue
[Error] invalid initialization of non-const reference of type 'ElemType& {aka int&}' from an rvalue of type 'int'这是函数参数引用临时变量错误,c++中临时变量不能作为非const的引用参数 解决方法:需要在函数声明和定义中在该参数的类型前添加const关键字。...原创 2019-01-28 14:11:18 · 7315 阅读 · 0 评论 -
前缀(波兰)、中缀、后缀表达式(逆波兰)
中缀转后缀1.遇到操作数:直接输出(加入到后缀表达式中)2.栈为空时,遇到运算符。直接入栈3.遇到左括号:将其入栈4.遇到右括号:运行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号。左括号不输出。5.遇到其它运算符:若当前运算符优先级低于栈顶运算符,则弹出全部优先级大于或者等于该运算符的栈顶元素并依次输出。然后将当前运算符入栈6.终于将栈中的元素依次出栈,输出。https:/...原创 2020-03-31 21:20:12 · 273 阅读 · 0 评论 -
KMP算法
KMP字符串匹配算法(KMP substring search)相关概念:主串(text)模式串(pattern);指针i指示主串,指针j指示模式串知识要点:了解字符串的前后缀;next数组的求解;根据next数组进行快速匹配串的模式匹配:求子串(模式串)在主串中的位置简单模式匹配算法【时间复杂度O(m*n)】由主串的第一个字符和模式串的第1个字符开始比较,若相等,则i、j指针...原创 2019-06-29 11:03:46 · 497 阅读 · 0 评论 -
查找——静态查找_插值查找
假如要在集合[1,100](分布不一定均匀)中查找10,我们下意识中肯定是看靠前的部分,而不是先看中间的部分。查单词也类似,如果在字典中查找“apple”,我们一般都是先翻到字典相对靠前的部分比对,而不是一开始就翻到正中间去比对,这就是插值查找的来源。插值查找在增长均匀的元素序列中效率最高(比折半查找高),在增长差异大的元素序列中效率最差(比折半查找低)。二分查找中查找点计算如下:mid=...原创 2019-02-19 17:13:45 · 197 阅读 · 0 评论 -
查找——静态查找_斐波那契查找
二分查找每次查找时会在查找范围上限的中点处比较,而斐波那契查找则在查找范围上限的一个斐波那契分割点上进行查找。斐波那契查找的优点是在确定下一个比对元素时,仅用加、减就可以计算得出,比二分查找的除法要节省时间。第一,计算并保存一个斐波那契序列的数组,fib[1]=1,fib[2]=1,fib[3]=2,fib[4]=3,fib[5]=5。 第二,将有序数组的长度扩充到 n=fib[k]-1...原创 2019-02-19 16:56:04 · 242 阅读 · 0 评论 -
查找——静态查找_二分查找
int BinarySearch(STable ST,int k){ int left,right,mid; left=1; right=ST.length; while(left<=right){ mid=(left+right)/2; if(k<ST.elem[mid]){ right=mid-1; }else if(k>ST.elem...原创 2019-02-17 21:29:42 · 374 阅读 · 0 评论 -
查找——静态查找_顺序查找
顺序查找://在elem[1]~elem[n]中查找关键字为k的数据元素 int SequentialSearch(SSTable ST,char k){ ST.elem[0]=k;//哨兵 int i; for(i=ST.length;ST.elem[i]!=k;i--);//从后往前找 return i;} #include<stdio.h>...原创 2019-02-17 16:17:42 · 315 阅读 · 0 评论 -
线索二叉树
线索二叉树:将指向空链域的左指针指向其前驱,右指针指向其后继。通过中序遍历对二叉树线索化的递归算法 通过中序遍历建立中序线索化二叉树(含头结点) 中序遍历建立中序线索化二叉树(不含头结点) 中序遍历二叉线索树的非递归算法#include<stdio.h>#include<stdlib.h>typedef struct ThreadNode{ cha...原创 2019-02-17 15:11:34 · 1065 阅读 · 0 评论 -
二叉链表存储(先序、后序、中序、层次遍历)
非递归解法如下:输入:ABD^^EG^^^C^F^^△前序遍历 A B D E G C F△中序遍历 D B G E A C F△后序遍历 D G E B F C A△层次遍历 A B C D E F G #include<stdio.h>#include<stdlib.h> #include<stack>#include<...原创 2019-02-14 22:28:27 · 4789 阅读 · 0 评论 -
二叉树的顺序存储(数组实现)
递归方式实现:ABCDE^F^^G————————————————————————————△深度和长度此时T的长度为:10,深度为:4————————————————————————————△层序遍历A B C D E F G————————————————————————————△前序遍历A B D E G C F————————————————————————————△中序遍...原创 2019-02-14 22:30:56 · 2730 阅读 · 0 评论 -
二叉树的遍历(图示+详细代码)递归与非递归解法
先序遍历(NLR):根结点 - 左子树 - 右子树中序遍历(LNR):左子树 - 根结点 - 右子树后序遍历(LRN):左子树 - 右子树 - 根结点输入:ABD^^EG^^^C^F^^△前序遍历 A B D E G C F△中序遍历 D B G E A C F△后序遍历 D G E B F C A△层次遍历 A B C D E F G 递归实现:(一)数组...原创 2019-02-13 19:29:18 · 551 阅读 · 0 评论 -
栈的应用——迷宫求解
do{ 若当前位置可通, 则{ 将当前位置插入栈顶; 若该位置是出口位置,则算法结束; 否则切换当前位置的东邻方块为新的当前位置; } 否则 { 若栈不空且栈顶位置尚有其他方向未被探索, 则设定新的当前位置为: 沿顺时针方向旋转找到的栈顶位置...原创 2019-01-28 21:03:45 · 380 阅读 · 0 评论 -
栈的应用——行编辑程序
在用户输入一行的过程中,允许 用户输入出差错,并在发现有误时 可以及时更正。其合理做法是:设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区,并假设“#”为退格符,“@”为退行符。#include<stdio.h>#include<stdlib.h> #define STACK_INIT_SIZE 100//顺序栈存储空间的初始...原创 2019-01-28 16:30:02 · 617 阅读 · 0 评论 -
栈的应用——进制转换
通过栈实现:对于任意一个非负十进制正数,输出与之等值的八进制数。#include<stdio.h>#include<stdlib.h> #define STACK_INIT_SIZE 100//顺序栈存储空间的初始分配量#define STACKINCREMENT 10//顺序栈存储空间的分配增量 #define OVERFLOW -2 //堆栈上溢...原创 2019-01-28 14:52:56 · 754 阅读 · 0 评论 -
顺序栈的基本操作
关于顺序栈的基本操作▲01初始化顺序栈,构造空栈S InitStack_Sq(SqStack &S)▲02销毁栈 DestoryStack_Sq(SqStack &S)▲03置空栈S ClearStack_Sq(SqStack &S)▲04 判断栈是否为空 StackEmpty_Sq(SqStack S)▲05返回栈S中元素个数 StackLength_Sq(S...原创 2019-01-28 14:15:53 · 487 阅读 · 0 评论 -
一元多项式的表示及其运算
明天继续完善Status cmp(PElemType a, PElemType b) { if (a.expn>=b.expn) return 1; else return 0;}void CreatPolyn(PLinkList &P, int m) { // 算法2.22 // 输入m项的系数和指数,建立表示一元多项式的有序链表P PLink ...原创 2019-01-25 22:42:16 · 813 阅读 · 0 评论 -
带头结点的线性链表基本操作以及归并操作
Status DelFirst_E(ELinkList *L, Link h, Link *q){ *q = h->next; if(*q) //链表非空 { h->next = (*q)->next; if(!h->next) //h后只有一个结点 (*L).tail = h; (*L).len--;...原创 2019-01-25 22:38:02 · 474 阅读 · 0 评论 -
双循环链表的基本操作
双循环链表的基本操作【算法2.18、2.19】Status InitList_DuL(DuLinkList *L){ *L = (DuLinkList)malloc(sizeof(DuLNode)); if(!(*L)) exit(OVERFLOW); (*L)->next = (*L)->prior = *L; return OK;} Status ...原创 2019-01-25 22:31:30 · 246 阅读 · 0 评论 -
静态链表的基本操作——集合运算
利用静态链表计算集合(A-B)∪(B-A),由终端输入集合元素,先建立表示集合A的静态链表S,而后在输入集合B的元素的同时查找S表,若存在和B相同的元素,则从S表中删除之,否则将此元素插入S表。【算法2.16】1.将整个数组空间初始化成一个链表 2.从备用空间取得一个结点 3.将空闲结点链结到备用链表上 #include<stdio.h>#include<...原创 2019-01-25 22:25:32 · 1210 阅读 · 1 评论 -
静态链表的基本操作
首先让数组的元素都是有两个数据域组成,data和cur。也就是说,数组的每个下标都对应一个data和一个cur。数据域data,用来存放数据元素,也就是通常我们要处理的数;而游标cur相当于单链表中的next指针,存放该元素的后继在数组中的下标。通常我们把这种用数组描述的链表叫做静态链表(游标实现法)。数组逻辑上分为两个链表:备用链表(空闲的节点)和数据链表(已被使用的节点)我们把静态...原创 2019-01-25 22:23:54 · 913 阅读 · 0 评论 -
单链表的基本操作——归并
将两个有序链表La、Lb合并为一个有序链表Lc : MergeList 【算法2.12】#include<stdio.h>#include<stdlib.h>typedef int Status; //状态码识别类型typedef int ElemType;#define OVERFLOW -2 //堆栈上溢#define UNDERFLOW...原创 2019-01-25 22:17:33 · 1105 阅读 · 0 评论 -
单链表的基本操作
学习严蔚敏老师《数据结构(C语言版)》,关于单链表的基本操作:1.单链表的存储结构2.初始化 InitList_L3.在带头结点的单链表中第i个位置之前插入元素e ListInsert_L【2.9】4.头插法建立单链表L(逆序输入)CreateList_HL【2.11】5.尾插法建立单链表L(顺序输入)CreateList_TL6.在带头结点的单链表中删除第i个元素,并用e返回其值 ...原创 2019-01-25 22:15:02 · 1290 阅读 · 0 评论 -
顺序表的基本操作——归并
1、【算法2.1】假设:有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即:线性表中的数据元素即为集合中的成员。 现要求一个新的集合A=A∪B。具体操作:扩大线性表 LA,将存在于线性表LB 中而不存在于线性表 LA 中的数据元素插入到线性表 LA 中去。代码实现:合并的代码:Union#include<stdio.h>#include<s...原创 2019-01-25 21:10:00 · 2633 阅读 · 0 评论 -
顺序表的基本操作
学习严蔚敏老师《数据结构(C语言版)》,关于顺序表的基本操作:1.线性表的动态分配顺序存储结构2.初始化 InitList_Sq【2.3】3.插入 ListInsert_Sq【2.4】4.删除 ListDelete_Sq【2.5】5.遍历顺序表 ListTraverse_Sq6.置为空表 ClearList_Sq7.销毁线性表 DestroyList_Sq8.判断是否为空表 Li...原创 2019-01-25 17:42:38 · 643 阅读 · 0 评论 -
【数据结构】陈越 —— 第一讲举例:最大子列和问题
最直接最暴力的算法:把所有的连续子列和全部算出来,然后从中找最大的那一个int Max3( int A, int B, int C ){ /* 返回3个整数中的最大值 */ return A > B ? A > C ? A : C : B > C ? B : C;} int DivideAndConquer( int List[], int ...原创 2019-01-15 16:01:05 · 390 阅读 · 0 评论 -
【数据结构】陈越 —— 第一讲
一.什么是数据结构1.写程序计算给定多项式在给定点x处的值。2.测试 函数 运行所需要的时间(以秒为单位计时)如果是十阶多项式的话,速度很快,不到一个tick,所以会输出0. 所以需要多跑几次,一直跑到间隔的时间能够被clock()捕获到。3.抽象数据类型 二.什么是算法 空间复杂度时间复杂度...原创 2019-01-15 16:00:03 · 534 阅读 · 0 评论 -
最小生成树—Prim算法和Kruskal算法 (理解)
一个带权连通无向图中可能有多棵生成树,所有生成树中具有边上的权值之和最小的树称为图的最小生成树。n个顶点的连通图的生成树有n个顶点、n-1条边,性质如下:1.不能有回路2.一个图的最小生成树不一定是唯一的,可能有多个。prim算法——让树慢慢变大 图G的顶点集合为U,生成树的集合为V。1.在U中选择一个顶点a加入V中。2.向外(U-V)找到一个点b,使ab之间权值最小,把b也加原创 2017-08-01 20:34:20 · 1279 阅读 · 1 评论 -
DFS(理解)
图的深度优先搜索(Depth First Search),与树的先序遍历相似,深度优先搜索是一个递归的过程。如图所示,深度优先遍历的顺序是:ABDECFG。DFS即一直往下搜索,直到搜不下去再返回上一层继续搜。典型例子就是走迷宫问题。简单框架如下:原创 2017-07-17 13:03:20 · 339 阅读 · 0 评论 -
BFS框架(理解)
BFS(Breadth First Search)从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1、V2、……Vn,然后依次访问与V1、V2……Vn相邻且未被访问的顶点,找到目标点或遍历完整张图与树的层次遍历相似,利用队列解决BFS问题,主要应用于求解迷宫 最短路径或最短步数问题,Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和BFS类似的思想。如图所...原创 2017-07-17 14:41:23 · 779 阅读 · 0 评论 -
最短路径—Dijkstra算法和Floyd算法(理解)
Floyd-Warshall——只有五行的算法求任意两个点之间的最短路程。 从i号顶点到j号顶点只经过前k号顶点的最短路程,这是一种动态规划的思想。for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(e[i][j]>e[i][k]+e[k][j])e[i][j]=e[i][k]+e[k][j];n个顶点,m条边,接下来原创 2017-08-05 00:02:15 · 36830 阅读 · 4 评论