![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
学习基本的数据结构以及各种算法思想
酸菜。
爱生活,爱TXJ。
展开
-
算法时间复杂度
算法时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。//简称为大O记法。注:一般情况下...原创 2020-01-12 16:59:03 · 253 阅读 · 0 评论 -
树和二叉树的存储结构
一:双亲表示法在这里插入代码片二:孩子表示法在这里插入代码片三:双亲孩子表示法在这里插入代码片四:孩子兄弟表示法在这里插入代码片五:二叉树的存储结构https://blog.csdn.net/qq_38158479/article/details/104107974...原创 2020-11-11 19:11:52 · 80 阅读 · 0 评论 -
栈的链式存储结构及实现
对于链栈来说,由于栈顶放在链表的头部,所以对于链栈来说是不需要头节点的。对于链栈来说,基本上不存在栈满的情况,除非内存已经没有可以使用的空间。对于空栈来说t->top=NULL;也就是相当于头指针指向空。它的结构如下:#ifndef _linkstack_h#define _linkstack_h#include<iostream>#include<s...原创 2020-01-20 21:44:52 · 378 阅读 · 0 评论 -
链式队列的概念及其相关基本运算
//main.cpp#include"linkqueue.h"int main(void){ linkqueue l=NULL; int i = 0, k = 0; l = initseqQueue();//创建一个空链式队列 for (i = 0; i <= 5; i++) { inseqQueue(l, i * 2);//进队 } show_seq...原创 2019-11-05 14:52:35 · 518 阅读 · 0 评论 -
串的顺序存储结构以及链式存储结构
原创 2019-10-14 21:56:39 · 1117 阅读 · 0 评论 -
二叉树相关概念及性质
一二叉树的定义:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。二二叉树特点:(1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。(注意:不是只有两颗子树,而是最多有)(2)左子树和右子树是有顺序的,次序不能任意颠倒。(3)即使树中某结点只有一棵子树,也要区分它是左子树还...原创 2020-01-28 19:35:23 · 384 阅读 · 0 评论 -
二叉树的存储结构
一:顺序存储结构二叉树的顺序存储结构是用一维数组存储二叉树的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系等。二叉树的存储-顺序存储完全二叉树:对结点按照上至下、从左到右的次序进行存储//代码实现(双亲表示法)typedef struct ptnode{ int data;/*结点数据*/ int parent;/*结...原创 2020-01-29 16:57:50 · 452 阅读 · 0 评论 -
跳跃表详解
https://blog.csdn.net/m0_37907797/article/details/102971476原创 2019-11-09 22:34:47 · 165 阅读 · 0 评论 -
数据结构知识点大全
https://blog.csdn.net/out_of_memory_error/article/details/102332332原创 2019-11-19 21:15:18 · 144 阅读 · 0 评论 -
KMP算法
kmp算法源于BF算法,主要思想在于不匹配时减少指针的移动次数。在匹配过程中出现字符比较不相等时,主串S已比较的位置不回溯,模式串T比较的位置进行移动。在匹配过程中有一个难题需要解决:如何计算模式串T在失配时的移动位数?部分匹配函数部分匹配函数是KMP算法中最难以理解的部分。首先需要理解前缀、后缀和最大共有长度的概念。前缀指除了最后一个字符以外,一个字符串的全部头部组合。后...原创 2019-11-08 11:42:53 · 198 阅读 · 0 评论 -
线索二叉树
一、线索二叉树的原理通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。记ptr指向二叉链表中的一个结点,以下是建立线索的规则:(1)如果ptr->lchild为空,...原创 2020-02-02 14:47:18 · 307 阅读 · 0 评论 -
单链表常见操作以及和顺序表的区别
单链表的定义:二:和顺序表的区别时间性能上:查找:顺序存储结构O(1),单链表O(n)插入和删除:顺序存储结构O(n),单链表O(1)线性表的顺序存储结构和单链表结构各具有其优缺点,不能简单的说那个好,那个坏,需要根据实际情况。来综合平衡采用哪种数据结构更能满足和达到需求和性能。//Linklist.cpp#include"Linklist.h"Link...原创 2019-09-26 14:32:25 · 751 阅读 · 0 评论 -
双向链表常见操作
//twowaylist.cpp#include"twowaylist.h"//思路:分插入的位置情况分别实现,插入的位置为1和其它。void insert_twowaynode(twowaylist* clist, int pos, int value){ int i = 0; twowaynode* node = (twowaynode*)malloc(sizeof(twoway...原创 2019-10-03 10:41:10 · 188 阅读 · 0 评论 -
普通顺序队列的不足以及解决方法
我们假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为0(1)。可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,...原创 2020-01-23 13:49:47 · 2021 阅读 · 0 评论 -
图的存储结构之边集数组
说明:边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息。这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。边集数组结构:顶点表结构:(用来存储顶点信息)typedef struct VertexNode4 /*顶点表结点*/{ VerterType data;/*数据域*/}vexs4[MAX];表现形式...原创 2020-02-19 15:50:25 · 5851 阅读 · 0 评论 -
树的相关概念
一树的定义:树(Tree)是n(n≧0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:有且仅有一个特定的称为根的结点。当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、T3……、Tm,其中每个集合本身又是一棵树,并且称为根的子树(subtree)。//例如:这里的子树是相对于某个结点来说的,例如BDGHI为A结点的左子树,CEFJ为A结点的右子树。而...原创 2020-01-28 16:58:27 · 303 阅读 · 0 评论 -
合并两个循环链表
#include"circularlist.h"int main(void){ int i = 0; CircularNode* p = NULL; CircularNode* q = NULL; //创建clist1循环链表 circularlinklist* clist1 = (circularlinklist*)malloc(sizeof(circularlinkli...原创 2020-01-18 15:26:10 · 958 阅读 · 0 评论 -
顺序队列的概念及其基本运算
//seqQueue.cpp#include"seqQueue.h"/* * @file seqQueue.cpp * @function 队列初始化 * @author 酸菜。 * @date 2019-09-17*/void initseqQueue(SeqQueue* Queue){ Queue->front = 0; Queu...原创 2019-10-31 18:40:07 · 643 阅读 · 0 评论 -
关于头节点和头指针的说明
使用头节点的好处:一:统一了空表和非空表的操作(插入元素,删除元素等,也就是说,在不使用头节点的情况下,元素在不同的位置插入,实现的思路可能会不一样,有了头节点之后,不论在那个位置插入元素,实现的思路都是一样的)二:简化了链表的代码实现。...原创 2019-10-04 11:16:58 · 599 阅读 · 0 评论 -
单链表的整表创建之头插法和尾插法算法思路
整表创建算法思路:1:声明一指针p和计数器变量i2:初始化一空表3:让L的头节点的指针域指向NULL,即建立了一个带头节点的空表。4:循环(1)生成一新的节点赋给p(2)赋值给新生成的节点的数据域p->data(3)将p插入到头节点与前一节点之间//头插法示例:void creatlist(linklist* l,int n,int value){ linklist*...原创 2020-01-16 13:39:13 · 852 阅读 · 0 评论 -
线性表的顺序存储结构常见操作
//main.cpp#include"seqlist.h"int main(){ seqlist* L = NULL; int i = 0; int *p = NULL; L = creat_seqlist(); for (i = 0; i < 10; i++) { insert_seqlist(L, i, i*2); } show_seqlist(...原创 2020-01-14 17:33:15 · 443 阅读 · 0 评论 -
排序算法
参考链接:https://blog.csdn.net/Gunanhuai/article/details/102407016原创 2019-11-07 19:17:31 · 71 阅读 · 0 评论 -
遍历二叉树
概述:我们把图形的方式来表现树的结构,对于我们来说是非常直观的,但是对于计算机来说,它只有循环,判断等方法来处理,也就是说它只会处理线性的序列,而我们讲的二叉树的遍历就是把树中的结点变成某种意义上的线性序列。一定义:二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次。注意:每个结...原创 2020-01-30 12:48:01 · 165 阅读 · 0 评论 -
写一个二叉堆的demo
一:概念什么的,可以参考小小的算法之旅这本书。二:c语言demo例程(最小堆)//main.c#include "BH.h"int main(int argc, char **argv){ int k[9] = {1,3,2,6,5,7,8,9,10}; int a[10] = {1,3,2,6,5,7,8,9,10,0}; int b[9] = {7,1,3,10,5,2,8,9,6}; upAdjust(a, sizeof(a)/sizeof(int));原创 2021-03-19 22:15:54 · 107 阅读 · 3 评论 -
程序员必学核心内容
https://blog.csdn.net/m0_37907797/article/details/102661778转载 2019-10-22 15:13:26 · 159 阅读 · 0 评论 -
静态链表相关概念及其操作
静态链表结构首先我们先来看看静态链表的结构定义typedef struct{ ElemType data; int cur; }Component,StaticLinkList[MAXSIZE];如上面代码所示,静态链表需要预先分配容量为MAXSIZE的存储空间(接下来以MAXSIZE值为5进行演示),data定义了数据元素,cur定义了数据元素的游标(可以理解为指向下一节点的...原创 2020-01-17 16:15:16 · 364 阅读 · 0 评论 -
树、森林与二叉树的转换以及树和森林的遍历
一:关于树,二叉树,森林的概念和区别可参考(1)https://blog.csdn.net/qq_38158479/article/details/104100460(2)https://blog.csdn.net/qq_38158479/article/details/104101826二:树转换为二叉树由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左...原创 2020-02-06 14:20:29 · 755 阅读 · 0 评论 -
二叉树的链式存储及常见操作
一:关于二叉树的链式存储请参考:https://blog.csdn.net/qq_38158479/article/details/104107974关于二叉树的遍历请参考:https://blog.csdn.net/qq_38158479/article/details/104113648二:代码实现:#include"BiTree.h"int main(void){ int no...原创 2020-02-01 20:22:06 · 853 阅读 · 0 评论 -
图的存储结构之邻接矩阵法
//代码示意如下:typedef char VerterType; /*顶点类型*/typedef int EdgType; /*边上的类型*//*图的邻接矩阵存储结构*/typedef struct graph0 { VerterType vexs[MAX];/*顶点表*/ EdgType arc[MAX][MAX];/*邻接矩阵*/ int numVertexes; /*...原创 2020-02-12 16:30:51 · 1063 阅读 · 0 评论 -
算法相关概念解释
算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。算法的特性:有穷性,确定性,可行性,输入,输出。算法的设计要求:正确性,可读性,健壮性,高效率和低存储。算法的度量方法:事后统计法,事前分析估计法。输入输出:算法有零个或多个输入,至少有一个或多个输出。有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接...原创 2020-01-13 13:15:15 · 350 阅读 · 0 评论 -
图的存储结构之十字链表
优点:可以同时表示有向图中的出度和入度问题,侧重点在于边。顶点表结点结构:typedef struct VerterNode2 //顶点表结点{ VerterType data; //顶点域,存储顶点信息 EdgeNode2* firstin; //边表头指针,入度 EdgeNode2* firstout; //边表头指针,出度}VerterNode2, C...原创 2020-02-19 12:32:20 · 517 阅读 · 0 评论 -
链栈的基本运算
//main.cpp#include"linkstack.h"int main(){ linkstack top; int i = 0; int data = 0; top = creat_stack(); for (i = 5; i > 0; i--) { push_stack(top, i); } show_stack(top); /*while (empty...原创 2019-10-29 15:05:43 · 793 阅读 · 0 评论 -
哈希表开放定址法demo
#include "HashTable.h"/*************************************************************** * @file HashTable.c * @brief 初始散列表 * @author txj * @version v1 * @date 2020/10/18 ********************************************************原创 2020-12-19 17:00:08 · 249 阅读 · 1 评论 -
判断一个链表是否为循环链表
(1)采用快慢指针法,定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向 NULL)都没有追上第一个指针,那么链表就不是环形链表。//功能函数如下int isloop(twowaylist* l){ if (l == NULL) { return 0...原创 2020-01-15 23:43:49 · 3296 阅读 · 0 评论 -
字符串模式匹配算法-BF算法
#include<stdio.h>#include<string.h>int BF(char* str1, char* str2, int length1, int length2, int pos);int main(){ char* a = "abcdffllkh"; char* b = "fl"; int n = 0, m = 0; int k = ...原创 2019-11-07 09:57:53 · 540 阅读 · 0 评论 -
双向循环链表的常见操作
#include"doublelinklist.h"int main(void){ int i = 0; doublelinklist* p = NULL; p = (doublelinklist*)malloc(sizeof(doublelinklist));//申请一个头节点 p->next = p;//头节点的前驱和后继分别指向自己,即完成了初始化工作 p->...原创 2020-01-18 23:26:00 · 180 阅读 · 1 评论 -
循环链表的定义以及常见操作
//circularlist.cpp#include"circularlist.h"void insertcircularlinklist(circularlinklist* clist, int pos, int value){int i = 0;//创建一个空节点CircularNode *node = (CircularNode*)malloc(sizeof(CircularNo...原创 2019-10-01 19:34:29 · 1722 阅读 · 1 评论 -
栈的基本概念及其顺序栈的基本运算
//main.cpp#include"seqstack.h"int main(void){ int i = 0; int k = 0; int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; seqstack* stack = (seqstack*)malloc(sizeof(seqstack));//申请内存空间 element* element_v...原创 2019-10-26 11:37:09 · 526 阅读 · 0 评论 -
树的孩子兄弟表示法详解
一:(1)关于原理介绍(大话数据结构那本书中介绍的很详细)(2)参考:https://blog.csdn.net/qq_25775935/article/details/88647758二:代码实现#include"cstree.h"int main(void){ cstree T = NULL; T = (cstree)malloc(sizeof(csnode)); in...原创 2020-02-04 15:13:47 · 750 阅读 · 0 评论 -
二叉树的顺序存储常见操作
一:二叉树的顺序存储结构二:创建二叉树的过程三:代码实现#ifndef _seqtree_h#define _seqtree_h#include<iostream>#include<stdlib.h>#include<stdio.h>#include<math.h>#define maxsize 100...原创 2020-01-31 11:49:59 · 2728 阅读 · 0 评论