数据结构
此专栏是数据结构和算法的综合笔记栏,里面包括计算机专业所学的数据结构这门课程的大多数算法,实时更新,欢迎前来查阅观看
xwzj的小白
每日更新学习内容,欢迎关注和指点
展开
-
数据结构之绪论
绪论文章目录:数据结构的基本概念数据结构的三要素算法的基本概念算法的时间复杂度和空间复杂度1.数据结构的基本概念2.数据结构的三要素逻辑结构物理结构对数据的计算1.逻辑结构分为以下四种:2.物理(存储)结构主要分两种:3.算法的基本概念4.算法的时间复杂度和空间复杂度...原创 2020-10-10 10:56:16 · 90 阅读 · 0 评论 -
数据结构之静态链表
静态链表文章目录:原创 2020-10-08 12:58:29 · 228 阅读 · 0 评论 -
数据结构之循环链表
循环链表文章目录:引述循环链表的特点循环单链表和循环双链表的初始化循环单链表的头插法和尾插法循环链表的应用(拓展)3.循环单链表和循环双链表的初始化4.循环单链表的头插法和尾插法#include <stdio.h>#include <stdlib.h> typedef struct node{ int data; struct node *next;//指针域 int size;//循环链表的长度}node,*lin原创 2020-10-07 10:46:59 · 517 阅读 · 0 评论 -
数据结构之双向链表
双向链表文章目录:双链表的结点结构双链表的插入双链表的删除双链表的初始化采用尾插法建立双链表查找结点的算法(扩展)双向链表的使用1.双链表5.初始化6.采用尾插法建立双链表void create( DLNode *&L,int a[],int n){ DLNode *s,*r; int i; L=(DLNode*)malloc(sizeof(DLNode)); L->prior=NULL; L->next=NULL; r原创 2020-10-07 08:34:56 · 397 阅读 · 0 评论 -
数据结构之链表
链表文章目录:链表单链表的定义(带头结点和不带头结点)单链表的插入删除原创 2020-10-06 18:54:43 · 87 阅读 · 0 评论 -
数据结构之线性表
线性表文章目录:线性表的定义线性表的基本操作顺序表的定义顺序表的两种实现方式顺序表的基本操作其他笔记的总结3.顺序表的定义4.顺序表的两种实现方式静态分配动态分配5.顺序表的基本操作插入删除按位查找按值查找6.其他笔记的总结以上是顺序表的内容,之后会更新单链表的相关知识内容。...原创 2020-10-05 16:06:21 · 284 阅读 · 0 评论 -
数据结构之栈
栈和队列1文章目录:栈的定义栈的基本操作栈的存储结构2.栈的存储结构顺序存储一定要注意top指针指向的是当前位置还是下一个可以插入的位置(用到的出入栈的代码也不一样)链式存储3.栈的基本操作//初始化一个栈,只需要将栈顶指针置为-1即可void initstack(sqstack &st){ st.top=-1; }int push(sqstack &st,int x){if(st.top==maxsiz原创 2020-09-29 09:33:08 · 122 阅读 · 0 评论 -
数据结构之队列
队列文章目录队列的定义队列的存储结构及相关操作双端队列2.队列的存储结构队列的顺序存储注意:队列的元素个数=(rear+maxsize-front)%maxsize链式存储结构3.双端队列...原创 2020-09-29 09:30:37 · 154 阅读 · 0 评论 -
数据结构之栈的应用
栈的应用文章目录括号匹配表达式1.括号匹配假设一个算术表达式中包含()、[] 和 {}3种类型的括号,编写一个算法判别表达式中括号是否匹配,以字符‘\0’作为算术表达式的结束符。算法思想:扫描每个字符,遇到圆、方、花的左括号是进栈,遇到圆、方、花的右括号时检查栈顶元素是否为相应的左括号,若是,退栈,否则匹配错误。最后栈不为空也为错误。完整代码#include<stdio.h>#include<stdlib.h>#include<string.h&g原创 2020-09-29 09:18:58 · 597 阅读 · 0 评论 -
数据结构之“串”的概念及基本操作
1.串的概念和相关术语2.串的基本操作赋值操作 //赋值操作 int strassign(String &str,char *ch) { //if(str.ch) //free(str.ch);//释放原串空间 int len=0; char *c=ch; while(*c)//求ch串的长度 { ++len; ++c; } if(len==0)//如果ch为空串,则直接返回空串 { str.ch==NUL原创 2020-09-22 07:43:44 · 1751 阅读 · 1 评论 -
串的KMP算法
KMP算法目录:KMP的由来next数组的引入怎样求next数组KMP算法的优化KMP算法的代码实现1.KMP算法的由来如图所示在朴素的模式匹配算法中当某些子串部分匹配时,主串的扫描指针经常性的回溯,而不是直接性的匹配后面的字符,由此引入KMP算法,把这种问题解决。2.怎么解决上述问题(next数组的引入)对于上述过程进行总结:kmp算法3.next数组的求法实质:1.将next[1]=0,next[2]=1.2,找到当前前j-1个字符3,分析此原创 2020-09-21 10:45:26 · 227 阅读 · 0 评论 -
数据结构之串的存储结构
本节学习脉络串的存储结构串的模式匹配算法1.串的存储结构串的定长顺序存储表示//定长顺序存储表示结构体定义如下:typedef struct{ char str[maxsize+1]; int length; }str; //maxsize为已经定义的常量,表示串的最大长度,str数组长度定义为maxsize+1是因为多出一个‘\0’作为结束标记串的变长分配存储表示即动态分配存储表示,特点是在程序执行过程中根据需要动态分配。这种存储方式在使用时需要用函数m原创 2020-09-21 07:52:34 · 1375 阅读 · 0 评论 -
数据结构之树(篇5)
文章目录:线索树树和森林树的应用哈夫曼树1.线索树原创 2020-08-23 17:37:46 · 167 阅读 · 1 评论 -
数据结构之二叉树的遍历方式(篇4)
二叉树的遍历方式文章目录:先序遍历中序遍历后序遍历递归–》非递归的转换层序遍历由遍历序列构造二叉树建树和遍历的完整代码1.先序遍历2.中序遍历3.后序遍历4.转非递归算法(借助栈)5.层次遍历(应用队列)6.由遍历序列构造二叉树7.建树和遍历的完整代码//二叉树建立和遍历的完整代码#include<stdio.h>#include<stdlib.h>typedef char ElemType;typedef stru原创 2020-08-18 08:13:18 · 104 阅读 · 0 评论 -
数据结构之树和二叉树的存储结构(开篇3)
树的存储结构1.二叉树的存储1.特殊二叉树的存储对于完全二叉树的存储,只要根据完全二叉树编号的性质就可以通过数组进行存储2.普通二叉树的存储(二叉树的链式存储)首先可以采用补完全二叉树的办法,没有结点的地方补0,但这样有弊端,当一棵树的子结点只有左结点或只有右结点时,需要补充大量的0结点2.树的存储结构1.双亲表示法具体代码//树的双亲表示法结点结构定义typedef int ElemType;typedef struct PTNODE{ Elemtype da原创 2020-08-17 08:35:07 · 185 阅读 · 0 评论 -
数据结构之树之二叉树(开篇2)
二叉树文章目录:二叉树特殊的二叉树及其性质二叉树的性质1.二叉树的概念2.特殊的二叉树及其性质1.满二叉树及其性质2.完全二叉树及其性质3.二叉排序树4.平衡二叉树3.二叉树的五大性质以上是有关二叉树的知识,其中二叉排序树和平衡二叉树已经在查找篇里面具体写了,想看这两个部分的知识请到数据结构专栏里对应查找即可。之后会更新树的存储结构,遍历方式,线索二叉树等相关知识。2020.8.16...原创 2020-08-16 17:13:16 · 104 阅读 · 0 评论 -
数据结构之树与二叉树开篇1
树与二叉树文章目录:树的概念树的基本术语树的性质1.树的基本概念2.基本术语3.树的性质下一篇会更新有关二叉树的相关知识。2020.8.16.原创 2020-08-16 15:33:02 · 98 阅读 · 0 评论 -
数据结构之排序篇最后讲-外部排序
外部排序(跟胜利者比较)原创 2020-08-12 06:14:22 · 863 阅读 · 0 评论 -
数据结构排序篇之归并排序和基数排序
归并排序和基数排序文章目录:归并排序基数排序1.归并排序1.算法思想2.图解3.核心代码4.具体代码#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10void MergeSort(int k[], int n){ // i 用于 for 循环迭代,temp 用来存储临时数组,所以要给他分配内存 int i, next, left_min, left_max, righ原创 2020-08-10 08:17:04 · 198 阅读 · 0 评论 -
排序续篇2之选择类排序
选择类排序文章目录:直接选择排序堆排序1直接选择排序1.算法思想实际上是每一趟选取无序序列最小的元素并加入到有序序列中。2.执行过程和核心代码3.具体代码#include<stdio.h>void selectsort(int a[],int n){ int i,j=0; int temp;//定义临时变量 int min;//定义一个存放最小数的变量 for(i=0;i<n-1;i++)//实际上排完n-1个之后,最后一个就是最大的,所以需要n-1原创 2020-08-09 09:01:32 · 90 阅读 · 0 评论 -
排序续篇1交换类排序之冒泡和快速排序
冒泡排序和快速排序文章目录:冒泡排序快速排序1.冒泡排序1.思想2.执行过程和核心代码3.具体代码#include<stdio.h>void bufflesort(int a[],int n){ int i,temp;//temp为临时变量 int count1=0,count2=0; //count1为排序次数计数器,count2为总比较次数 for(i=0;i<n-1;i++)//要进行n-1趟排序 { count1++;//进行完一趟冒泡原创 2020-08-08 08:22:43 · 125 阅读 · 0 评论 -
数据结构之排序
排序文章目录:直接插入排序折半插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序外部排序(子算法:置换选择排序,败者树,最佳归并树)1.排序1.排序的概述整理2.算法的稳定性3.内部和外部排序2.直接插入排序1.算法思想2.执行过程3.核心代码4.具体代码#include<stdio.h>/*算法思路:每次比较刚开始要和前一个元素比较, 如果前一个元素大于该比较元素, 则先把前一个元素交换原创 2020-08-07 09:18:03 · 182 阅读 · 0 评论 -
数据结构之图的遍历
图的遍历文章目录BFS的算法思想BFS的代码执行BFS的相关问题DFS的算法思想DFS的代码执行DFS的相关问题1.BFS算法思想BFS,即图的广度优先搜索遍历,它类似于图的层次遍历,它的基本思想是:首先访问起始顶点v,然后选取v的所有邻接点进行访问,再依次对v的邻接点相邻接的所有点进行访问,以此类推,直到所有顶点都被访问过为止。2.代码执行过程和具体实现BFS和树的层次遍历一样,采取队列实现,这里添加一个标记数组,用来标记遍历过的顶点。1.执行步骤:首先任取图中一个顶点访原创 2020-07-31 20:26:38 · 1116 阅读 · 0 评论 -
数据结构之图的存储结构
图的存储结构文章目录:邻接矩阵法邻接表法十字链表法邻接多重表1.邻接矩阵法1.有向图的邻接矩阵表示注意:1.顶点的出度等于该顶点对应的行之和。2.顶点的入度等于该顶点对应的列之和。3.有向图的邻接矩阵不对称2.无向图的邻接矩阵表示注意:无向图的邻接矩阵关于主对角线对称1.无向图的邻接矩阵对称2.无向图的顶点的度等于该顶点所对应行或者列的和。3.由邻接矩阵的行数或者列数可知图中的顶点数3.网的邻接矩阵表示4,邻接矩阵的代码表示5.邻接矩阵的性质这里邻接矩阵原创 2020-07-30 17:06:23 · 550 阅读 · 0 评论 -
数据结构之图的基本概念
图文章目录:图的基本概念图的存储结构图的遍历最小代价生成树最短路径拓扑排序关键路径文章将按照上述目录依次讲解这一节主要谈第一部分:图的基本概念和相关术语1.图的概念图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E).其中,G表示一个图,V是G中顶点的结合,E是G中边的集合.区分于线性表和树的结点,在图中数据元素称为顶点线性表相邻的数据元素之间具有线性关系树结构相邻两层的结点具有层次关系而图结构中任意两个顶点之间都可能有关系,顶点之间原创 2020-07-28 22:24:15 · 1720 阅读 · 0 评论 -
数据结构之散列表
散列表文章目录:基本概念Hash函数的构造方法Hash的冲突处理办法查找成功和失败的ASL1.基本概念2.常用Hash函数的构造方法3.冲突解决办法有多个关键字共用一个地址,这种情况叫做冲突,这时也称关键字key1和key2是hash函数H的同义词,这是不允许出现的,因此要解决这一问题,通过冲突解决方法消除冲突,使得每个地址对应一个关键字。开放定址法链地址法4.平均查找长度ASL1.对于用开放定址法的Hash表求ASL:1)ASL1:查找每个关键字原创 2020-07-22 19:08:59 · 308 阅读 · 0 评论 -
数据结构之B树和B+树
B树和B+树文章目录;B树的基本概念B-树的基本操作B+树的基本概念两者的区别1.B树的基本概念注意:结点的分支数=关键字数+1如果B树的阶数为m,则结点中关键字个数范围为[m/2]-1~m-1;下层结点内的关键字取值总是落在由上层结点的关键字所划分的区间内,具体落在哪个区间内可由指向它的指针看出。2.B树的基本操作删除终端结点的关键字1.直接删除2.借兄弟结点3.合并删除非终端结点的关键字注意:相邻关键字,相邻关键字为其左子树中值最大的关原创 2020-07-22 17:37:22 · 204 阅读 · 0 评论 -
数据结构之平衡二叉树
平衡二叉树文章目录:基本概念平衡二叉树的判断平衡二叉树在建立过程中的四种平衡调整1.基本概念2.平衡二叉树的判断3.平衡调整(四种)注意:1.此平衡二叉树的删除结点的部分和二叉排序树删除结点的情况一模一样,也是三种删除情况 2.最小不平衡子树:以距离插入结点最近,且以平衡因子的绝对值大于1的结点作为根的子树,我们称这棵树为最小不平衡子树。 我们想构造一个平衡二叉树来提高二叉排序树的效率。在构造过程中, 难免会遇到某一结点插入构造树时会使这原创 2020-07-21 18:39:58 · 221 阅读 · 0 评论 -
数据结构之二叉排序树
二叉排序树文章目录:二叉排序树的概念二叉排序树的操作(查找,插入,构建,删除)二叉排序树的时间复杂度四种二叉排序树操作的代码实现1.二叉排序树2.二叉排序树的基本操作1.查找2.插入3.构建这里注意一点,同样的数据,当顺序不同时会构造出不一样的二叉排序树。4.删除得到的二叉树可能相同,也可能不同。这里详细总结一下删除关键字的三种情况:当在二叉排序树中删除一个关键字时,不能把以该关键字所在的结点为根的子树都删除,而只是删除这一个结点,并且保持二叉排序树的特性。删除结原创 2020-07-21 17:36:48 · 401 阅读 · 0 评论 -
数据结构之查找篇
查找文章目录:顺序查找折半查找分块查找B树B+树二叉排序树平衡二叉树散列表字符串的模式匹配(KMP)首先了解一下查找的基本概念:首先下面的图是一般的查找方法:明确查找的数据结构和数据次序这两个问题是解决查找问题的捷径。ASL:即平均查找长度(平均比较次数),是衡量一个查找算法效率优劣的标准1.顺序查找顺序表的查找分为有序查找和无序查找无序查找1.无序查找的代码实现①通过添加哨兵的方式2.查找成功和失败的ASL注意:这里通过对elem[0]添加哨原创 2020-07-20 22:37:12 · 322 阅读 · 0 评论 -
数据结构之数组,矩阵,广义表
数组,矩阵,广义表1.数组给出书上的题2.矩阵的压缩存储原创 2020-07-17 18:58:51 · 998 阅读 · 0 评论 -
数据结构算法之关键路径
关键路径文章目录:基本概念关键路径的构造过程关键路径的特点1.基本概念首先要了解AOE网和关键路径的基本概念这里详细说明一下,AOE网和AOV网的区别和联系:联系:都代表的是有向无环图。区别:1.AOE网的边表示活动,边有权值,边一般代表的是活动持续时间,顶点表示事件,事件是图中新活动开始或者旧活动结束的标志。2.AOV网的顶点表示活动,边无权值,边代表活动之间的先后关系。3.对于一个表示工程的AOE网,只存在一个入度为0的顶点,称为源点,表示整个工程的开始;也只存在一个出度为原创 2020-07-14 18:41:23 · 6383 阅读 · 0 评论 -
拓扑排序
拓扑排序文章目录基本概念算法思想算法的执行过程拓扑排序的特点算法的代码实现1.基本概念首先掌握拓扑排序之前先要了解几个基本概念:这里AOV网即是一种以顶点表示活动,以边表示活动先后次序的且没有回路的有向图。2.算法思想拓扑排序就是将一个有向无环图中的所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若存在由u到v的路径,则在拓扑排序序列中一定是u出现在v的前边。可能直接看算法思想有点理解不来,下面给出具体执行过程:3.算法执行过程1.首先初始化一个数组,数组内存放图中原创 2020-07-13 17:31:59 · 2602 阅读 · 0 评论 -
最短路径续集之弗洛伊德算法
弗洛伊德算法文章目录:回忆之前讲的迪杰斯特拉算法弗洛伊德算法优缺点分析及其算法的区别1.回忆之前讲述了迪杰斯特拉算法,它的思想是:设有两个顶点集合S和T,集合S中存放图中已找到最短路径的顶点,集合T存放图中剩余顶点,初始状态时,集合S中只包含源点V0,然后不断从集合T中选取到顶点v0路径长度最短的顶点Vu并入到集合S中。这里需要注意的是,集合S每并入一个新的顶点Vu,都要修改顶点V0到集合T中顶点的最短路径长度值。之后不断重复此过程,直到集合T的顶点全部并入到S中为止。由思想我们可以看出原创 2020-07-08 09:48:02 · 367 阅读 · 0 评论 -
图的最短路径(迪杰斯特拉和弗洛伊德)算法
最短路径问题文章目录:最短路径的概念迪杰斯特拉算法弗洛伊德算法1.最短路径 首先我们要清楚什么是最短路径,怎么样称为最短。 概念:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重(权值)之和最小的一条路径,称为最短路径。知道了什么是最短路径之后,怎么样实现这个最短路径问题,找到给出某个图中的最短路径呢,下面介绍两种实现最短路径的算法(迪杰斯特拉和弗洛伊德)这里注意一点:通常采用迪杰斯特拉算法求图中某一顶点到其余各顶点的最短路径通常采用弗洛伊德算法求图中任意一对顶点原创 2020-07-06 09:56:41 · 961 阅读 · 0 评论 -
图的最小生成树(普里姆和克鲁斯卡尔)算法
最小生成树文章的目录如下:最小生成树的相关概念普里姆算法克鲁斯卡尔算法1.最小生成树首先要知道什么是最小生成树,这里的最小指的是图的生成树的权值之和最小,最小生成树可由以下几点的概念组成:一个图的生成树集合当中权值之和最小的生成树,可以有一种,也可以有多种,这与图本身结构有关。包括了图中的所有节点,所有节点之间都有边,但是没有连通图;就是有 N个顶点 有N-1个边;就是一个连通图的极小连通子图(它包含图中的所有顶点,并且只含有尽可能少的边。),这意味着对于生成树来说,若看原创 2020-07-05 23:37:17 · 5512 阅读 · 1 评论