数据结构
有些内容可能出错,大家看的时候留心一下
再来一炖
这个作者很懒,什么都没留下…
展开
-
哈希算法介绍
哈希算法哈希函数:在密码学中,哈希函数H是一个公开函数,用于将任意长的消息M映射为较短的、固定长度一个值H(M),作为认证符,称函数值H(M)为哈希值或哈希码或消息摘要。哈希函数的安全性要求给定数据容易计算出哈希值,但给定哈希值不能计算出数据。哈希码提供了一种错误检测能力。使用哈希函数提供消息认证有6种基本使用方式:(1)消息与哈希码链接后用单钥加密算法加密(2)用单钥加密算法仅对哈希码加密(3)用公钥加密算法和发方的秘密钥仅加密哈希码,这种方法提供了数字签名(4)消息的哈希码值用公钥加密算原创 2021-12-12 16:15:34 · 1620 阅读 · 0 评论 -
哈希表简介
哈希表概念:哈希表是用来存储键值对的,可以平衡时间和空间的数据结构,用空间来换空间。当键是整数时,可以用无序数组来实现哈希表。哈希函数:要将键映射到存储的下标(地址),就需要一个函数,这就是哈希函数的功能。哈希冲突处理:使用哈希函数时,很多时候存在将多个键映射到同一个下标(地址)的情况,这就产生了冲突,此时就需要处理哈希冲突。Hash函数构造方法:直接定址法:直接定址法是以数据元素关键字k本身或它的线性函数作为它的哈希地址数字分析法:从中提取分布均匀的若干位或它们的原创 2021-12-07 21:26:13 · 151 阅读 · 0 评论 -
简单选择排序、树形选择排序
文章目录1.简单选择排序2.树形选择排序1.简单选择排序简单选择排序算法思想:(1)在第i趟排序过程中,通过n-i次关键字之间的比较,从剩余的n-i+1个记录中选出最小的记录,并和第i个记录交换。(2)对于i=1,…,n-1,执行上述过程,直至整个序列有序。简单选择排序算法://5.简单选择排序void SelectSort(SqList& L) { KeyType temp; int k; for (int i = 1; i < L.length; i++) {原创 2021-08-28 22:33:41 · 185 阅读 · 0 评论 -
冒泡排序、快速排序
文章目录1.冒泡排序2.快速排序1.冒泡排序冒泡排序也称简单交换排序。它的基本操作很简单。首先将第一个记录与第二个纪录相比较,如果为逆序,则交换两者,然后比较第二个和第三个记录,以此类推,直到第n-1个关键字和第n个关键字相比较为止,这为一趟冒泡,其结果是最大的记录被安排到了最后一个位置。然后进行第二趟冒泡,对前n-1个记录进行同样操作,直到完成n-1趟冒泡为止。冒泡排序算法://冒泡排序#define MAXSIZE 256typedef int KeyType;typedef struc原创 2021-08-28 19:44:15 · 234 阅读 · 0 评论 -
直接插入排序、希尔排序
文章目录1.直接插入排序2.希尔排序1.直接插入排序直接插入排序 是一种最简单的排序算法,它的基本操作是将一个记录插入已排好的有序表,从而得到一个新的、记录数增加1的有序表。例如:设有一个由待排序的一组记录组成的线性表,关键字的初始序列为{48,35,66,91,74,18}。我们可以认为第一个关键字{48}组成的线性表已是有序表;将第二个关键字插入前面的有序表,使之有序,得到序列{35,48};再将第三个关键字插入,使之有序,得到序列{35,48,66};如此重复,直到所有关键字都已插入,完成排序。原创 2021-08-28 16:42:25 · 151 阅读 · 0 评论 -
图的深度优先遍历和广度优先遍历
图的遍历: 从给定图中指定的顶点出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使得每个顶点只会被访问一次,这个过程叫做图的遍历。图的遍历方法有两种:深度优先遍历(DFS)和广度优先遍历(BFS)。1.深度优先遍历深度优先遍历类似于树的先序遍历。一次深度优先遍历的基本过程可以用递归的方法来描述:(1)从起始点v出发,首先访问顶点v。(2)选择一个与顶点v相邻接且没有被访问过的顶点w作为新的起始点,继续深度优先遍历,直到顶点v的所有邻接点都被访问过。例如,对于无向图来说,如果无向图是连通的,则一原创 2021-08-22 11:41:42 · 3415 阅读 · 0 评论 -
图的邻接表表示及其基本操作
1.邻接表邻接表是一种链式存储结构。它用n个带头结点的单链表代替邻接矩阵的n行,并对图中的每个顶点v建立一个带头结点的单链表,将顶点v的相关信息存放在表头,表中的其余顶点用来存放与顶点v相关边的信息,例如其邻接点的编号、相应的边的权值。下图是相关图的邻接表形式。2.图的邻接表存储结构声明#define MAX_V 20#define OK 1#define ERROR 0typedef int ElemType, Status;typedef int GraphKind; //定义图原创 2021-08-21 23:53:04 · 11061 阅读 · 1 评论 -
图的邻接矩阵表示及其基本操作
图的邻接矩阵表示及其基本操作文章目录图的邻接矩阵表示及其基本操作1.邻接矩阵1.邻接矩阵表示图的一种简单方式是使用二维数组,称为邻接矩阵表示法。图中的每条边(v, w),设置A[v][w]=1;若不存在边(v, w),则A[v][w] = 0;如果边上带权值,那么可以设置A[v][w]等于该权值,同时使用一个很大或者很小的权值来表示不存在的边。如图,展示了无向图、有向图、有向网和它们的邻接矩阵。邻接矩阵是一种顺序结构,从邻接矩阵的行数或者列数可知图的顶点数。无向图的邻接矩阵总是对称的,但有向图的邻原创 2021-08-21 17:51:06 · 13181 阅读 · 0 评论 -
三元组的十字链表表示
当稀疏矩阵的非零元素位置和个数在操作过程中变化比较大时,就不适合采用顺序表示的三元组存取方式,此时采用链式结构更为合适。由于每个三元组包含了矩阵中非零元素的行、列信息,因此链式结构不是采用通常的单链结构,而是采用包含行、列指针的十字链表,分别指向该行和该列的下一个节点。其中每个节点包含有五个域:row、col、val三个域表示三元组;right域指向同一行下一非零元素指针;down域是指向同一列下一非零元素的指针。同一行的三元组通过right指针形成一个单链表,同一列的三元组通过down指针形成一个单.原创 2021-08-15 09:42:51 · 1613 阅读 · 0 评论 -
广义表的概念及其存储结构
广义表的定义广义表一般定义为GL=(a1,a2,a3…,an),n>=0。其中GL是广义表的名称,n是广义表的长度。在线性表中,ai是单元素。在广义表中,ai可以是单元素也可以是广义表,它们分别称为广义表的原子和子表。显然,广义表的定义时递归的。一般用大写字母表示广义表的子表,用小写字母表述广义表的原子。当广义表GL非空时,第一个元素a1为GL的表头,其余元素组成的子表(a2,…,an)称为GL的表尾。(1)A=() A是一个空表,其长度为0(2)B=(a)B的长度为1,元素为原子,已经退.原创 2021-08-15 10:55:28 · 7587 阅读 · 2 评论 -
二叉树的链式存储
二叉树的链式存储:二叉树的链式存储就是二叉树中每个结点都用一个链表中的一个链结点来存储。不同的结点结构可以构成不同的链式结构。根据二叉树的定义可知,二叉树的一个结点由一个数据元素和分别指向其左、右孩子的两个分支构成,那么用来表示二叉树结点的链结点至少应该包含3个域:数据域和左、右指针域,这种存储方式称为二叉链表链表的头指针指向二叉树的根结点。有时,为了便于找到结点的双亲,还可以在结点中增加一个指向其父结点的域,这种结构称为三叉链表。二叉树的二叉链表存储表示为:typedef struct B.原创 2021-08-16 19:53:35 · 4185 阅读 · 0 评论 -
二叉树的顺序存储
二叉树的顺序存储:二叉树的顺序存储就是用一组连续的存储单元来存放二叉树的数据元素。首先要对树中的每个结点进行编号,编号顺序就是结点在顺序表中的存储顺序。编号方法是:按照完全二叉树的形式,根结点的编号为1,然后按照层次从上到下、每层从左到右的顺序对每个结点进行编号。当某结点是编号为i的结点的左孩子时,它的编号应为2i,当他是右孩子时编号则为2i+1。二叉树的顺序存储表示:#define MAX_SIZE 256 //二叉树的最大结点数typedef TElem SqBiTree[MAX_SI.原创 2021-08-15 21:17:19 · 7844 阅读 · 0 评论 -
二叉树的性质
性质1:在二叉树的第i层上至多有2^(i-1)个节点。性质2:深度为k的二叉树最多包含2^k -1个节点。性质3:对任意一棵二叉树T,如果叶节点数为n0,度为2的节点数为n2,则n0= n2+1原创 2021-08-15 15:05:02 · 58 阅读 · 0 评论 -
链式队列基本操作的实现
具体代码如下:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef int ElemType, Status;typedef struct LNode //链式队列节点{ ElemType data; //每个节点的数据 struct LNode* next; //指向下一个节点}LNode, *QueuePtr;typedef struct Link原创 2021-07-18 22:06:49 · 160 阅读 · 0 评论 -
循环队列的实现
循环队列由于队列的入队和出队分别在线性表的两端不同于栈的一端操作,如果直接用顺序表来表示队列,则出队操作比较麻烦,每次出队都要移动整个队列的元素,但不移动又会浪费顺序表前面的存储空间。为了解决这个问题,提出来循环队列的思想,即将顺序表的表头和表尾连在一起,同时用front和rear两个指针分别指向循环队列的队头和队尾。循环队列的描述方法如下:#define MAXQSIZE 256 //队列的最大长度typedef struct SeqQueue{ ElemType* pBase;原创 2021-07-18 20:43:52 · 239 阅读 · 0 评论 -
N皇后问题
N皇后问题对于N皇后问题,这里以4皇后问题为例给出问题定义。4皇后问题是指在4X4的国际象棋盘上,放置4个“皇后”棋子,同时满足这样的条件:任意两个皇后不出现在同一行、同一列、同一正斜线和同一逆斜线上。这里以4皇后问题为例,采用回朔法的思想进行4皇后的放置,过程见下图。假设第1个皇后放在第1行1列(图1),则第2个皇后可放置的第一个候选位置是第2行第3列(图2)。这样第3个皇后在第3行就没有候选位置(图3),需要“回退”到第2行,重新摆放第2个皇后,改为第2行第4列(图4),则第3个皇后可放置在第3行第原创 2021-07-17 19:21:20 · 1259 阅读 · 0 评论 -
栈实现算术表达式求值
算术表达式求值利用栈求解的一个典型的问题是算术表达式求值,例如:“3+4*2-(1+1)#”,这样的表达式计算,在计算过程中,不是读到一个运算就立即计算,而是要与后面的运算符进行优先级比较,以决定先算哪一个。为解决问题,首先要进行一些约定。表达式由操作数、运算符和界限符组成。操作符和运算符是表达式的主要组成部分,界限符标志一个表达式的结束。表达式分为3类,及算术表达式、关系表达式、逻辑表达式这里只讨论算术表达式,并对表达式做如下简化:(1)...原创 2021-07-17 13:57:28 · 9908 阅读 · 5 评论 -
栈实现括号匹配检验
括号匹配检验一段代码会涉及圆括号、方括号、花括号,这些括号成对的出现,且符合最近匹配原则。如果出现漏写、错写则会导致程序编译通不过。显然,要进行匹配,栈是合适的结构。每当遇到一个括号字符时如果左括号就进栈;如果右括号,则将其栈顶的左括号进行匹配,若匹配成功将该左括号弹栈。正确的情况是,遍历完程序代码字符串后所有括号都能匹配且栈空。出错情况有以下几种:(1)当前的右括号与栈顶的左括号不属于同一类型。(2)直到代码遍历结束也没有遇到待匹配的右括号。(3)栈空却还有多余的右括号。算法具体描述如下:依次原创 2021-07-16 12:26:23 · 2785 阅读 · 1 评论 -
栈实现回文字符串判断
回文判断:正读和反读都相同的字符序列称为回文。从回文的定义可以看出,回文字符串的正序和逆序输出结果是相同的,算法需要做的就是将字符串串进行进栈然后出栈操作,将其与正序字符串进行比较,相同则为回文。#include<stdio.h>#include<stdlib.h>#include<string.h>//以下是自己写的关于链式栈的基本操作,之后在进行回文字符串的判断#define OK 1#define ERROR 0typedef char Ele原创 2021-07-16 09:50:18 · 2591 阅读 · 1 评论 -
链式栈基本操作的实现
具体实现代码如下:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef int ElemType, Status;typedef struct LNode //栈元素节点{ ElemType data; //数据 struct LNode* next; //指向下一个节点}LNode, *LinkStack;Status InitStack(LinkS原创 2021-07-15 23:43:18 · 241 阅读 · 0 评论 -
顺序栈基本操作的实现
实现代码如下:#include<stdio.h>#include<stdlib.h>#define STACKINITSIZE 256 //初次分配空间大小#define STACKINCREMENT 128 //空间分配增量大小#define OK 1#define ERROR 0typedef int ElemType, Status;typedef struct SeqStack{ ElemType* pBase; //动态存储空间原创 2021-07-15 19:03:51 · 93 阅读 · 0 评论 -
链表基本操作的实现
代码如下:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef int ElemType, Status;typedef struct LNode{ ElemType data; //数据域 struct LNode* next; //指针域}LNode, * LinkList;typedef struct SListInfo{ LinkList hea原创 2021-07-13 10:56:10 · 201 阅读 · 0 评论 -
双向链表基本操作的实现
实现代码如下:#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef int ElemType, Status;typedef struct DuLNode //定义双向链表的节点结构{ ElemType data; struct DuLNode* prev; //指向前一个节点 struct DuLNode* next; //指向下一个节点}DuLNod原创 2021-07-13 18:28:41 · 138 阅读 · 0 评论 -
循环链表基本操作的实现
#include<stdio.h>#include<stdlib.h>#define OK 1;#define ERROR 0;typedef int ElemType, Status;typedef struct LNode{ ElemType data; struct LNode* next;}LNode, *LinkList;typedef struct CircListInfo //循环链表定义{ LinkList head;原创 2021-07-13 23:52:03 · 142 阅读 · 1 评论 -
双向循环链表基本操作的实现
#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef int ElemType, Status;typedef struct LNode //双向循环链表节点{ ElemType data; //数据 struct LNode* next; //指向下一个节点指针 struct LNode* prev; //指向前一个节点指针}LNode, *DuC原创 2021-07-14 13:37:22 · 159 阅读 · 0 评论 -
线性表——顺序结构和基本操作的实现
具体实现代码如下:#include<stdio.h>#include<stdlib.h>#define LISTINITSIZE 256 //顺序表初始分配的空间大小 #define LISTINCREMENT 128 //空间分配的增量大小 #define OK 1#define ERROR 0typedef int ElemType, Status; //定义元素和函数返回值类型 typedef struct{原创 2021-07-12 15:02:00 · 77 阅读 · 0 评论