数据结构
文章平均质量分 90
整理基于C语言数据结构与算法相关知识
ATFWUS
电子科技大学硕士,CSDN博客专家。曾在两家top互联网大厂及一家央企工作,拥有丰富的工程实践经验,热爱技术的开源与分享。关注我,一起在计算机的海洋里系统化的学习!(本博客简介见个人主页或博客简介专栏)
展开
-
基于C语言的数据结构基础知识整理-文章目录
0x01.线性表C数据结构与算法-基础整理-线性表-01:顺序表操作集C数据结构与算法-基础整理-线性表-02:双向链表操作集C数据结构与算法-基础整理-线性表-03:循环链表解决约瑟夫环C数据结构与算法-基础整理-线性表-04:静态链表0x02.栈和队列C数据结构与算法-基础整理-栈和队列-01:栈的基础操作C数据结构与算法-基础整理-栈和队列-02:队列的基础操作...原创 2020-02-24 16:27:14 · 43511 阅读 · 0 评论 -
举例理解哈夫曼树与哈夫曼编码
举例理解哈夫曼树,C语言实现哈夫曼树原创 2021-06-20 13:36:44 · 21099 阅读 · 1 评论 -
是否为同一棵二叉搜索树--标记已访问变量法
0x01.问题注:本题来自于PTA-数据结构与算法题目集(中文)-7-4 是否同一棵二叉搜索树,原题链接:https://pintia.cn/problem-sets/15/problems/7120x02.分析问题题目要判断多个序列构成的二叉排序树是否完成相同,可以理解为判断多棵二叉排序树是否相等。最普通的办法肯定就是每输入一棵树就生成一棵树,然后比较两棵树是否完成一样,...原创 2020-03-10 17:18:55 · 345 阅读 · 0 评论 -
树的同构问题--双循环解决
0x01.问题给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1(上)给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2(下)就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非...原创 2020-03-10 13:15:17 · 713 阅读 · 0 评论 -
PTA题解-数据结构与算法题目集(中文)-12道函数题
地址:数据结构与算法题目集(中文)0x01.单链表逆转地址:6-1 单链表逆转List Reverse( List L ){ List tmp,pnew; pnew=NULL; while(L) { tmp=L->Next; L->Next=pnew; pnew=L; L=t...原创 2020-02-24 11:08:48 · 2373 阅读 · 1 评论 -
KMP模式匹配算法详解
0x01.关于KMP算法KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)...原创 2020-02-23 15:48:40 · 21794 阅读 · 4 评论 -
【数据结构基础整理】栈应用--02:逆波兰算法
0x01.关于逆波兰算法中缀表达式:中缀表达式表示操作符、运算符在需要计算的数值中间后缀表达式:在20世纪30年代,波兰逻辑学家Jan.Lukasiewicz发明了一种不需要括号的后缀表达式,我们通常把它称为逆波兰表达式(RPN),逆波兰表达式也叫后缀表达式。后缀表达式的优点:去除原来表达式中的括号,因为括号只指示运算顺序,不是实际参与计算的元素。 使得运算顺序有规律可寻,计...原创 2020-02-24 15:10:46 · 869 阅读 · 0 评论 -
【数据结构基础整理】栈应用--01:判断括号匹配问题
0x01.问题说明给出一个表达式,要求判断表达式中的括号是否匹配,比如((()))匹配,[)不匹配。0x02.解决思路凡遇到左括号,入栈,凡遇到右括号,与栈顶的括号比较,看是否匹配,如果有一个不匹配,那么整个表达式不匹配,如果匹配完后栈中还有元素,或者是匹配的时候栈空了,说明左右括号数量对不上,不匹3配。0x03.解决代码#include<stdio.h>#in...原创 2020-02-24 14:14:09 · 2794 阅读 · 0 评论 -
【数据结构基础整理】栈和队列--02:队列的基础操作
0x01.关于队列队列是一种先进先出的数据结构,有入队(EnQueue)和出队(DeQueue)操作。因为数据的存放取出存在优先级的,所有广泛用于各种算法。队列同样要注意队头指针和队尾指针。关于循环队列,主要要知道判满与计算长度的数学思想。0x02.基础数组队列#define SIZE 50typedef struct{ int data[SIZE]; int he...原创 2020-02-24 14:08:08 · 342 阅读 · 0 评论 -
【数据结构基础整理】栈和队列--01:栈的基础操作
0x01.关于栈栈是一种后进先出的数据结构,只有两种操作,入栈(push)和出栈(pop),因为涉及到优先级,被广泛应用于各种算法。对于栈需要注意的就是栈顶指针的具体含义,因为在不同的应用下会有不同的含义。0x02.基本数组栈的操作#define SIZE 50//注意数组下标和栈顶指针的开始值不同typedef struct{ int data[SIZE]; int ...原创 2020-02-24 13:56:09 · 425 阅读 · 0 评论 -
【数据结构基础整理】排序--06:七种经典排序算法的比较
0x01.七种经典的排序算法分别为 冒泡排序,插入排序,选择排序,希尔排序,堆排序,归并排序,快速排序。其中,希尔排序,堆排序,归并排序,快速排序,都属于改进的排序算法。具体算法可参考:C数据结构与算法-基础整理-排序-01:三种简单排序算法C数据结构与算法-基础整理-排序-02:希尔排序C数据结构与算法-基础整理-排序-03:堆排序C数据结构与算法-基础整理-排序-0...原创 2020-02-22 20:31:26 · 488 阅读 · 0 评论 -
【数据结构基础整理】排序--05:快速排序
0x01.关于快速排序快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序被列为20世纪十大算法之一,是...原创 2020-02-22 19:46:21 · 459 阅读 · 0 评论 -
【数据结构基础整理】排序--04:归并排序
0x01.关于归并排序归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。0x02.递归方式的归并排序先看代码:void ...原创 2020-02-22 19:04:59 · 569 阅读 · 0 评论 -
【数据结构基础整理】排序--03:堆排序
0x01.关于堆排序堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。0x02.堆的结构...原创 2020-02-22 14:47:29 · 515 阅读 · 0 评论 -
【数据结构基础整理】排序--02:希尔排序
0x01.关于希尔排序希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。在希尔排序之前的排序算法时间复杂度都是 ,希尔排序是首个打破这个复杂度的算法。0x02.算法代码void Sh...原创 2020-02-22 12:58:19 · 401 阅读 · 0 评论 -
【数据结构基础整理】排序--01:三种简单排序算法
选择排序,冒泡排序,插入排序0x01.排序所用到的顺序表和交换函数#define MAXSIZE 50typedef struct{ int r[MAXSIZE + 1];//0号下标一般不存储真实数据 int length;//表长}SqList;void swap(SqList* L, int i, int j){ int temp = L->r[i];...原创 2020-02-22 11:58:08 · 484 阅读 · 0 评论 -
【数据结构基础整理】查找--02:哈希表的理解
0x01.什么是哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表...原创 2020-02-23 16:26:15 · 499 阅读 · 0 评论 -
【数据结构基础整理】图--09:拓扑排序和关键路径
0x01.相关概念AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity On Vertex Network)。 拓扑序列:设 是一个具有 个顶点的有向图, 中的顶点序列 满足若从顶点 到 有一条路径,则在顶点序列中顶点 必在顶点 之前。我们称这样的顶点序列为一个拓扑序列。 拓扑排序...原创 2020-02-20 13:11:00 · 527 阅读 · 0 评论 -
【数据结构基础整理】图--08:详解弗洛伊德算法
详解最短路径中的弗洛伊德算法0x01.关于弗洛伊德算法Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。0x02.算法代码void ShortestPath_Floyd(Graph G, int** P, i...原创 2020-02-19 11:43:09 · 16203 阅读 · 0 评论 -
【数据结构基础整理】图--07:详解迪杰斯特拉算法
详解最短路径中的迪杰斯特拉算法0x01.关于迪杰斯特拉算法迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。这个算法不适用于含负权值的图。0x02.最短路径最短路径就是图上两个顶点...原创 2020-02-18 20:46:31 · 702 阅读 · 0 评论 -
【数据结构基础整理】图--06:克鲁斯卡尔算法详解
详解最小生成树中的克鲁斯卡尔算法0x01.关于克鲁斯卡尔算法Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表。克鲁斯卡尔算法主要针对边集数组展开。0x02.基础代码这个算法主要是针对边集数组,先来看一下边集数组的结构://边集数组typedef struct{ int begin; int end; int weig...原创 2020-02-18 13:02:58 · 17851 阅读 · 1 评论 -
【数据结构基础整理】图--05:普里姆算法详解
详解最小生成树的普里姆算法0x01.关于普里姆算法普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。0x02.生成树和最小生成树既然普里姆算法是关于最小生成树的算法,那么什么是什么是生成树和最小生成...原创 2020-02-17 13:43:40 · 21696 阅读 · 1 评论 -
【数据结构基础整理】图--04:深度优先搜索和广度优先
代码实现图的深度优先搜索和广度优先搜索0x01.深度优先搜索(DFS)搜索方法说明:从名字中 可以得知,这个方法根本在于深度,那么何为深度?在树中,我们了解了哟个概念叫树的高度,其实深度就类似于树的高度,那么既然是深度优先,那么我们遍历何查找的时候每一步都应该找到最深处,在树中可以说是遍历到叶结点,然后一个深度遍历完成后,退回来,继续遍历下一个深度。在图中,这个深度应该是指一个顶点的...原创 2020-02-16 12:54:41 · 4709 阅读 · 0 评论 -
【数据结构基础整理】图--03:十字链表,邻接多重表
具体实现十字链表和邻接多重表的代码0x01.十字链表由来:邻接表只适合对某个顶点的出度相关信息进行判断,逆邻接表只适合对入度的相关信息进行判断,当同时需要判断的时候,就需要引入一种新的结构:十字链表。为什么叫十字链表?首先来看一下十字链表的顶点结构:data指顶点的数据域;firstin表示顶点第一个指向由顶点作为弧头的弧(顶点为终点);firstout表示顶点第一个...原创 2020-02-16 11:54:41 · 685 阅读 · 0 评论 -
【数据结构基础整理】图--02:图的最常见的两种创建方式
主要讲解图的最常用的两种创建方式,邻接矩阵和邻接表,代码实现0x01.邻接矩阵含义:用两个数组来表示图,一个一维数组存储顶点的信息,一个二维数组(邻接矩阵)存储边或弧的信息。对于普通的图(指没有权值的图):如果 或 则.反之,.求某个顶点的度,其实就是这个顶点 在矩阵中第 行的元素之和。对于无向图,如:对于有向图,如:网图,是带权值的图。...原创 2020-02-15 12:43:07 · 818 阅读 · 0 评论 -
【数据结构基础整理】图--01:图的相关术语整理集合
整理了图的常用术语0x01.图的定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中的顶点的集合,E是图G中边的集合。图中数据元素称为顶点,顶点间的逻辑关系用边表示。0x02.多种图的定义无向边:若顶点 到 之间的边没有方向,则称之为无向边(Edge),用无序偶对()来表示。无向图:任意两个顶点之间...原创 2020-02-14 11:44:34 · 468 阅读 · 0 评论 -
【数据结构基础整理】树--09:赫夫曼树
0x01.关于赫夫曼树给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。0x02.相关概念路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径。 路径长度:路径上的分支称为路径长度 结点的权:给每个结点赋予的具有特殊含...原创 2020-02-23 19:26:30 · 613 阅读 · 0 评论 -
【数据结构基础整理】树--08:二叉排序树
二叉排序树的多种操作0x01.二叉排序树概念二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。它可以是一棵空树。二叉排序树必须满足以下条件:若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值。 若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值。 它的左右子树也分别为二叉排序树。0...原创 2020-02-20 16:50:34 · 628 阅读 · 0 评论 -
【数据结构基础整理】树--07:线索二叉树(二)
本章具体实现前序和后序线索化的代码,相关原理可参考一下章节:C数据结构与算法-基础整理-树-06:线索二叉树(一)0x01.前序顺序下的线索二叉树二叉树的建立方式与上文完成相同,不同的只有线索化和遍历的过程线索化://前序线索化过程void PreThreading(BinTree BT){ if (BT) { if (!BT->Left)//左孩子不存在...原创 2020-02-13 15:05:12 · 266 阅读 · 0 评论 -
【数据结构基础整理】树--06:线索二叉树(一)
线索二叉树的原理和实现代码关于二叉树可以查看以下文章:C数据结构与算法-基础整理-树-02:二叉树的建立及四种遍历方式具体前序和后序方式线索化,可以参考以下文章:C数据结构与算法-基础整理-树-07:线索二叉树(二)0x01.线索二叉树由来在普通二叉树中,叶结点或只有一个孩子的结点会存在许多空指针域,这些空间已经创建了,但并没有得到有效的利用,造成了空间的浪费。解决办...原创 2020-02-13 13:13:00 · 517 阅读 · 0 评论 -
【数据结构基础整理】树--05:图解-树的后序遍历
图解树的后序遍历递归执行过程本章建立在以下章节的基础上:C数据结构与算法-基础整理-树-02:二叉树的建立及四种遍历方式C数据结构与算法-基础整理-树-03:图解-通过前序遍历对递归执行原理的深入理解C数据结构与算法-基础整理-树-04:图解-树的中序遍历后序遍历函数递归执行过程图解代码如下://后序遍历,递归实现void PostorderTraversal(...原创 2020-02-12 14:35:02 · 624 阅读 · 0 评论 -
【数据结构基础整理】树--04:图解-树的中序遍历
图解树的中序遍历递归执行过程本章建立在以下章节的基础上:C数据结构与算法-基础整理-树-02:二叉树的建立及四种遍历方式C数据结构与算法-基础整理-树-03:图解-通过前序遍历对递归执行原理的深入理解中序遍历函数递归执行过程图解代码如下://中序遍历,递归实现void InorderTraversal(BinTree BT){ if (BT == NULL)...原创 2020-02-12 13:43:11 · 1034 阅读 · 0 评论 -
【数据结构基础整理】树--03:图解-通过前序遍历对递归执行原理的深入理解
通过树的递归实现前序遍历的例子,深入理解递归的执行原理前序遍历函数递归执行过程图解代码如下://前序遍历,递归实现void PreorderTraversal(BinTree BT){ if (BT == NULL) return; printf(" %c", BT->data); PreorderTraversal(BT->Left); ...原创 2020-02-12 12:13:51 · 675 阅读 · 0 评论 -
【数据结构基础整理】树--02:二叉树的建立及四种遍历方式
树-02:二叉树的建立及四种遍历方式整理了完全二叉树的建立方法以及四种遍历方式(多种方法实现)在保证结构定义一样的前提下,代码可通用。0x01.二叉树的结构定义:typedef struct TreeNode{ char data; struct TreeNode* Left;//左孩子指针 struct TreeNode* Right;//右孩子指针}Tree...原创 2020-02-11 16:31:06 · 762 阅读 · 0 评论 -
【数据结构基础整理】树--01:树的相关术语性质整理
树-01:树的相关术语整理整理树的基础相关术语0x01.树的定义:定义:树(Tree)是有n(n>0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:1.有且仅有一个特定的称之为根(Root)的结点。2.当n>1时,其余结点可分为m(m>0)个互不相交的有限集 T1、T2、…、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)0x02....原创 2020-02-11 13:13:29 · 408 阅读 · 0 评论 -
【数据结构基础整理】线性表--04:静态链表
0x01.理解静态链表静态链表其实就是用数组的方式实现一个链表,静态链表有以下约定。每一个元素的游标域存储着下一个元素的下标 最后一个元素的游标为0 0号元素存储着备用链表的第一个元素的下标 备用链表就是静态链表中没被使用过的元素 每次增加结点,使用模仿的malloc函数,找到备用链表的一个结点 每次删除结点,使用模仿的free函数,将这个结点放入备用链表0x02.结构#...原创 2020-02-24 12:24:05 · 399 阅读 · 0 评论 -
【数据结构基础整理】线性表--03:循环链表解决约瑟夫环
///循环链表的实际应用:解决约瑟夫环问题#include<stdio.h>#include<stdlib.h>typedef struct PE{ int number; struct PE* next;}PE;PE* head = NULL;void inilink(int n){ head = (PE*)malloc(sizeof(PE...原创 2020-02-24 11:43:42 · 510 阅读 · 0 评论 -
【数据结构基础整理】线性表--02:双向链表操作集
0x01.结构typedef struct SLIST{ int data; struct SLIST * next; struct SLIST* front;}SLIST;SLIST* head=NULL;//全局指针SLIST* end = NULL;0x02.创建void CreateList(){ head = (SLIST*)malloc(sizeo...原创 2020-02-24 11:40:44 · 355 阅读 · 0 评论 -
【数据结构基础整理】线性表--01:顺序表操作集
0x01.相关结构与宏定义//宏定义正误类型#define ok 1#define error 0#define true 1#define false 0//定义初始化顺序表的大小#define INI_SIZE 50//定义每次增加的大小#define ADD_SIZE 5//定义函数返回值类型typedef int Status;//定义数据类型,暂定为i...原创 2020-02-24 10:52:38 · 508 阅读 · 0 评论