数据结构与C
文章平均质量分 51
是我来晚了!
一起努力呀!
展开
-
《数据结构》八大排序算法
冒泡排序、直接插入排序、折半插入排序、希尔排序、简单选择排序、快速排序堆排序、归并排序、基数排序原创 2022-06-07 19:20:11 · 351 阅读 · 2 评论 -
(数据结构)图的邻接表存储结构
图的邻接表存储结构一般来说,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表、邻接多重表和十字链表本篇文章将优先介绍邻接表!!!邻接点:在图中,如果两个点相互连通,且通过其中一个顶点,可直接找到另一个顶点,则称它们互为邻接点邻接:指图中顶点之间有边或者弧的存在邻接表存储图的实现方式:给图中的各个顶点独自建立一个链表,用节点存储该顶点,用另一个链表中的节点存储其邻接点特殊之处是,为了便于管理这些链表,通常会将链表的头节点存储到数组中,也正因为各个链表的头节点存储的是各个顶原创 2022-04-03 10:54:02 · 4163 阅读 · 1 评论 -
(数据结构)对图的顺序存储结构的补充
图的顺序结构存储无向网和有向网如下是一个有向网!!!代码实现如下(包括无向网):#include <stdio.h>#define MAX_NUM 20 // 顶点的最大个数typedef enum{ DG, DN, UDG, UDN // 依次代表的值为 0,1,2,3} GraphKind; // 枚举图的 4 种类型typedef struct{ int adj; // 对于无权图(用 1或 0表示是否相邻)对于带权图(直接为权值) .原创 2022-04-02 23:42:36 · 235 阅读 · 0 评论 -
(数据结构)图的顺序存储结构
图的顺序存储结构使用数组存储图时,需要使用两个数组,一个数组存放图中顶点本身的数据(一维数组),另外一个数组用于存储各顶点之间的关系(二维数组)不同类型的图,存储的方式略有不同,根据图有无权,可以将图划分为两大类:图和网图:包括无向图和有向图网:是指带权的图,包括无向网和有向网存储方式的不同指的是:在使用二维数组存储图中顶点之间的关系时,如果顶点之间存在边或弧,在相应位置用 1 表示,反之用 0 表示;如果使用二维数组存储网中顶点之间的关...原创 2022-04-02 23:25:24 · 1324 阅读 · 0 评论 -
(数据结构)生成树
生成树在连通图的基础上,本篇文章将介绍什么是生成树,以及什么是生成森林先介绍生成树!!!对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树图 1 连通图及其对应的生成树图 1 中,左侧是一张连通图,右侧是其对应的 2 种生成树但是介绍到这里我想疑问还是很多的,比如说遍历的方法是什么!生成树的定义是什么!遍历的方法:连通图中,通过任意两顶点之间可能含有多条通路进行遍历图 1 中,右侧第一张生成树的遍历过程为或 ...原创 2022-04-02 22:15:21 · 9772 阅读 · 3 评论 -
(数据结构)连通图
图存储结构分类之连通图连通:图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的图 1 顶点之间的连通状态示意图图 1 中,虽然 V1 和 V3 没有直接关联,但从 V1 到 V3 存在两条路径和,因此称 V1 和 V3 是连通的连通图(无向图):任意两个顶点之间都能够连通图 2 连通图示意图图 2 中,因为此无向图中任意两顶点之间都是连通的,故此图就是一个连通图连通分量:若无向图不是连通图,但图中存储某...原创 2022-04-02 21:45:59 · 9852 阅读 · 0 评论 -
(数据结构)图存储结构
图存储结构数据之间的关系有三种,分别是一对一、一对多和多对多,前两种关系的数据可分别用线性表和树结构存储,本篇文章将介绍具有多对多逻辑关系数据的结构(图存储结构)先看一看如下的无向图!!!图 1 无向图示意图图 1 所示为存储 V1、V2、V3、V4 的图结构,从图中可以看出数据之间具有的多对多关系,例如,V1 与 V4 和 V2 建立着联系,V4 与 V1 和 V3 建立着联系与链表不同,图中存储的各个数据元素被称为顶点(而不是节点)图存储结构中,习惯上用 表示图中的顶点,且原创 2022-04-01 23:14:49 · 359 阅读 · 0 评论 -
(数据结构)N 个结点构造多少种树
相似树和等价树如果两棵树中各个结点的位置都相对应,可以说这两棵树相似;如果两棵树不仅相似,而且对应结点上的数据也相同,就可以说这两棵树等价对题目的解读本篇文章要讨论的是当给定 N 个结点时,可以构建多少种形态不同的树(互不相似)对于任意一棵普通树,通过孩子兄弟表示法的转化,都可以找到唯一的一颗二叉树与之对应,于是乎本篇文章研究的问题也可以转化成:N个结点可以构建多少种形态不同的二叉树每一棵普通树对应的都是一棵没有右子树的二叉树(孩子兄弟表示法的转化后),所以对于 N个结点的树来说,...原创 2022-04-01 22:31:42 · 4111 阅读 · 2 评论 -
(数据结构)浅谈回溯算法(一)
题目描述列举如下集合中的所有子集{1, 2, 3}在解决列举如上集合中所有子集的问题中,就可以使用回溯算法从集合的开头元素开始,对每个元素都有两种选择:取还是舍,当确定了一个元素的取舍之后,再进行下一个元素,直到集合最后一个元素;其中的每个操作都可以看作是一次尝试,每次尝试都可以得出一个结果,将得到的结果综合起来,就是集合的所有子集代码实现#include <stdio.h>int set[5];// i代表数组下标,n表示集合中最大的元素值void Po.原创 2022-03-31 23:18:47 · 306 阅读 · 0 评论 -
(数据结构)哈夫曼树
哈夫曼树相关的几个名词图1 哈夫曼树路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径图 1 中,从根结点到结点 a 之间的通路就是一条路径路径长度:在一条路径中,每经过一个结点,路径长度都要加 1图 1 中,从根结点到结点 c 的路径长度为结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权图 1 中,结点 a 的权为 ,结点 b 的权为结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积...原创 2022-03-31 23:05:47 · 1310 阅读 · 0 评论 -
(数据结构)树的Child_Brother表示法
树的孩子兄弟表示法此前介绍过用双亲表示法和孩子表示法存储普通树,本篇文章将讲解最后一种存储普通树的方法...最后一种方法是孩子兄弟!!!孩子兄弟表示法,采用的是链式存储结构其存储的实现思想是:从树的根节点开始,依次用链表存储各个节点的孩子节点和兄弟节点因此,该链表中的节点应包含以下 3 部分内容:节点的值 指向孩子节点的指针 指向兄弟节点的指针树的孩子兄弟表示法的代码实现...原创 2022-03-31 21:02:19 · 6616 阅读 · 1 评论 -
(数据结构)树的Child表示法
树的孩子表示法此前介绍过用双亲表示法存储普通树,本篇文章将讲解另一种存储普通树的方法...另一种方法是孩子表示法!!!孩子表示法存储普通树采用的是:顺序表和链表的组合结构其存储过程是:从树的根节点开始,使用顺序表依次存储树中各个节点,需要注意的是,与双亲表示法不同,孩子表示法会给各个节点配备一个链表,用于存储各节点的孩子节点位于顺序表中的位置(而双亲表示法会配置一个整型变量,用来保存双亲的位置)如果节点没有孩子节点(叶子节点),则该节点的链表为空链表例如,使用孩子表示法存储下图左侧的原创 2022-03-31 15:00:51 · 2670 阅读 · 0 评论 -
数据结构第二次实验报告 —— 多项式的链表表示
多项式的链表表示原创 2022-03-30 22:30:00 · 303 阅读 · 0 评论 -
(数据结构)树的双亲表示法
树的双亲表示法此前写过二叉树的顺序存储和链式存储,此篇文章将介绍普通树是如何存储的...通常,存储具有普通树结构数据的方法有 3 种:双亲表示法 孩子表示法 孩子兄弟表示法而本篇文章将优先介绍双亲表示法!!!双亲表示法采用顺序表(数组)存储普通树,其实现的核心思想是:顺序存储各个节点的同时,给各节点附加一个记录其父节点位置的变量图 1 普通树双亲表示法存储图 1 中普通树,其存储状态如图 2 所示 :图 2 双亲表示法存储普通树示意图注意!!!根节点没有父节点原创 2022-03-30 22:25:43 · 6039 阅读 · 0 评论 -
(数据结构)二叉树层次遍历
二叉树层次遍历二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队;而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果图1 二叉树以上图 1 为例,层次遍历的过程如下:首先,根结点 1 入队 根结点 1 出队,出队的同时,将左孩子 2 和右孩子 3 分别入队 队头结点 2 出队,出队的同时,将结点 2 的左孩子 4 和右孩子 5 依次入队 队头结点 3 ...原创 2022-03-30 21:23:38 · 14187 阅读 · 5 评论 -
(数据结构)二叉树后序遍历
二叉树后序遍历二叉树后序遍历的实现思想是:访问当前节点的左子树 访问当前节点的右子树 访问根节点图 1 二叉树以上图 1 为例,后序遍历的过程如下:从根节点 1 开始,遍历该节点的左子树(以节点 2 为根节点) 遍历节点 2 的左子树(以节点 4 为根节点) 由于节点 4 既没有左子树,也没有右子树,此时访问该节点中的元素 4,并回退到节点 2 ,遍历节点 2 的右子树(以 5 为根节点) 由于节点 5 无左右子树,因此可以访问节点 5 ,并且此时节点 2 的左右子树也遍历原创 2022-03-30 21:00:01 · 4320 阅读 · 0 评论 -
(数据结构)二叉树中序遍历
二叉树中序遍历二叉树中序遍历的实现思想是:访问当前节点的左子树 访问根节点 访问当前节点的右子树图 1 二叉树以上图 1 为例,中序遍历的过程如下:访问该二叉树的根节点,找到 1 遍历节点 1 的左子树,找到节点 2 遍历节点 2 的左子树,找到节点 4 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树 由于节点 4 无右子树,因此节点 2 的左子树遍历完成,访问节点 2 遍历节点 2 的右子树,找到节点 5 由于节点 5 无左子树,因此访问节点 5原创 2022-03-30 13:28:43 · 12582 阅读 · 6 评论 -
(数据结构)二叉树先序遍历
二叉树先序遍历二叉树先序遍历的实现思想是:访问根节点 访问当前节点的左子树 若当前节点无左子树,则访问当前节点的右子树图 1 二叉树以上图 1 为例,先序遍历的过程如下:访问该二叉树的根节点,找到 1 访问节点 1 的左子树,找到节点 2 访问节点 2 的左子树,找到节点 4 由于访问节点 4 左子树失败,且也没有右子树,因此以节点 4 为根节点的子树遍历完成;但节点 2 还没有遍历其右子树,因此现在开始遍历,即访问节点 5 由于节点 5 无左右子树,因此节点 5 遍原创 2022-03-29 22:27:14 · 10983 阅读 · 5 评论 -
(数据结构)二叉树的链式存储结构
二叉树的顺序存储的缺点因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或少会存在空间浪费的现象图 1 普通二叉树的转化如上图 1,普通二叉树里只有二个元素,最好的存储方式当然是开辟相对应的空间,但是顺序存储结构却让我们不能这么做!也就是说我们此时必须花更多的空间去存储相对少的元素二叉树的链式存储先慢慢介绍一下链式存储的节点结构!!!图 2 普通二叉树示意图如上图 2 所示,若将其采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用链表存储因原创 2022-03-29 20:47:49 · 10744 阅读 · 0 评论 -
(数据结构)二叉树的顺序存储结构
二叉树的存储结构有两种,分别为顺序存储和链式存储原创 2022-03-29 20:14:46 · 8345 阅读 · 3 评论 -
(数据结构)二叉树
什么是二叉树简单地理解,满足以下两个条件的树就是二叉树:本身是有序树 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2如上图右侧结点 1 有三个分支(度为 3),故不满足二叉树的条件二叉树的性质二叉树具有以下几个性质:二叉树中,第 层最多有个结点 如果二叉树的深度为 ,那么此二叉树最多有 个结点 二叉树中,叶子结点数为 ,度为 2 的结点数为 ,则性质 3 的计算方法为:令二叉树度为 0 的结点(叶子结点)数为...原创 2022-03-29 16:13:31 · 146 阅读 · 0 评论 -
(数据结构)树存储结构 —— 2022/3/29
树存储结构树结构概括树的结点子树和空树结点的度和层次有序树和无序树森林树的表示方法树结构概括树结构是一种非线性存储结构,存储的是具有一对多关系的数据元素的集合如上图是使用树结构存储集合 {A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意图具体一对多关系表现在:数据 A 和数据 B、C、D 有关系;数据 B 和 A、E、F 有关系…树的结点结点:使用树结构存储的每一个数据元素都被称为结点(结点 A)(如下三个概念)对于结点 A、B、C、D 来说!!!父结点(双亲结点):在子结原创 2022-03-29 14:56:40 · 333 阅读 · 0 评论 -
(数据结构)利用 C语言实现顺序队列及链队列
顺序队列及链队列顺序队列—— 头文件构造入队列的函数构造展示队列元素的函数构造出队列的函数—— 主函数对顺序队列的优化 —— 环状队列—— 头文件构造初始化队列的函数构造入队列的函数构造展示队列元素的函数构造出队列的函数—— 主函数链队列—— 头文件结构体声明队列节点构造创建链式队列的函数构造尾插法插入链队列元素的函数构造出列函数—— 主函数顺序队列—— 头文件#include <stdio.h>构造入队列的函数// 入队列int enQueue(int *queue, int r原创 2022-03-27 18:41:05 · 1428 阅读 · 0 评论 -
(数据结构)广义表的存储结构
广义表广义表的优点广义表的原子和子表广义表的表头和表尾广义表的存储方式广义表的优点数组可以存储不可再分的数据元素,也可以存储数组(即 n 维数组)int arr_1[] = {1, 2, 3, 4, 5}; // 存储了整型数据的一维数组int arr_2[][2] = {1, 2, 3, 4}; // 二行二列的二维数组// int arr_2[2][2] = {{1, 2}, {3, 4}};数组不能同时存储数据元素和数组!int arr_3[][] = {1, {2, 3原创 2022-03-27 14:49:52 · 1757 阅读 · 0 评论 -
C语言实现稀疏矩阵的转置
#include <stdio.h>#define number 10// 结构体声明三元组节点 typedef struct { int i, j; int data;} triple;// 结构体声明稀疏矩阵节点 typedef struct { triple data[10]; int n, m, num;} TSMatrix;int index = 1; // 全局变量(记录三元组的索引值) // 输出存储的稀疏矩阵void d原创 2022-03-27 12:26:53 · 496 阅读 · 0 评论 -
(数据结构)C语言稀疏矩阵存储之十字链表 —— 2022/3/27
十字链表—— 头文件利用结构体声明元素节点利用结构体声明矩阵节点构造初始化十字链表矩阵的函数构造展示十字链表的函数—— 主函数—— 头文件#include <stdio.h>#include <stdlib.h>利用结构体声明元素节点// 元素节点 typedef struct OLNode{ int i, j, e; // 矩阵三元组 i代表行,j代表列,e代表当前位置的数据 struct OLNode *right, *down; // 指针域原创 2022-03-27 10:40:00 · 649 阅读 · 0 评论 -
(数据结构)C语言稀疏矩阵存储之行逻辑链接 —— 2022/3/26
行逻辑链接—— 头文件结构体声明三元组和稀疏矩阵构造增添三元组元素的函数构造展示稀疏矩阵的函数—— 主函数—— 头文件#include <stdio.h>#define number 5 // 代表有四个非零元素 #define NUM 4 // 代表有三行 结构体声明三元组和稀疏矩阵// 结构体声明三元组节点 typedef struct { int i, j; int data;} triple;// 结构体声明稀疏矩阵节点 typedef str原创 2022-03-26 17:19:09 · 817 阅读 · 0 评论 -
(数据结构)C语言稀疏矩阵存储之三元组 —— 2022/3/25
稀疏矩阵的三元组—— 头文件结构体声明三元组结构体声明稀疏矩阵构造增添三元组元素的函数构造展示稀疏矩阵的函数—— 主函数—— 头文件#include <stdio.h>#define number 3结构体声明三元组// 结构体声明三元组节点 typedef struct { int i, j; int data;} triple;结构体声明稀疏矩阵// 结构体声明稀疏矩阵节点 typedef struct { triple data[number原创 2022-03-25 23:36:35 · 5200 阅读 · 0 评论 -
(数据结构)KMP字符串匹配算法 —— 2022/3/24
#include <stdio.h>#include <string.h>#include <stdlib.h>// 计算需匹配字符串的 next数组 void cal_next(char *str, int *next, int len){ next[0] = -1; // 字符串的前一位的next值为 0(代表不存在前缀和后缀) int k = -1; // k初始化为 -1 for(int q = 1; q <= len原创 2022-03-24 19:13:23 · 1744 阅读 · 1 评论 -
C语言循环链表实现解决约瑟夫环问题 —— 2022/3/23
示例代码#include <stdio.h>#include <stdlib.h>typedef struct mytable{ int *head; int length; int size;} table;table initTable(int Size){ table t; t.head = (int*)malloc(Size*sizeof(int)); // 分配Size空间的容量 if (!t.head){ printf("初始化顺序表失败"原创 2022-03-23 23:42:27 · 1587 阅读 · 3 评论 -
(数据结构)利用 C语言实现三元组 —— 2022/3/22
三元组—— 头文件利用结构体声明节点构造初始化函数构造删除函数构造值设置函数—— 主函数—— 头文件#include<stdarg.h>#include<malloc.h>#include<stdio.h>#include<stdlib.h> // atoi()#include<io.h> // eof()#include<math.h>#define TRUE 1#define FALSE 0#define O原创 2022-03-22 22:55:38 · 2180 阅读 · 2 评论 -
C语言字符串的输入和输出 —— 2022/3/21
字符串的输入和输出字符串的输出字符串的输入字符串的输出在C语言中,有两个函数可以在控制台(显示器)上输出字符串二个字符串输出函数!!!1:puts() 输出字符串并自动换行,该函数只能输出字符串2:printf() 通过格式控制符 %s输出字符串,不能自动换行#include <stdio.h>int main(){ char str[] = "www.baidu.com"; // puts() 函数输出字符串自动换行!!! puts(str); puts("w原创 2022-03-21 22:41:46 · 917 阅读 · 1 评论 -
C语言字符数组和字符串 —— 2022/3/20
字符数组和字符串字符数组字符串结束标志字符串长度字符数组用来存放字符的数组称为字符数组char str_1[10]; // 一维字符数组char str_2[5][10]; // 二维字符数组字符数组实际上是一系列字符的集合,也就是字符串(String)C语言规定,可以将字符串直接赋值给字符数组(单个字符多次赋值过于麻烦)// 通常情况char str[14] = {"www.baidu.com"};char str[14] = "www.baidu.com"; // 这种原创 2022-03-20 19:56:09 · 351 阅读 · 1 评论 -
(数据结构)C语言中字符串存储的三种形式 —— 2022/3/19
字符串串串的定长顺序存储串的堆分配存储串的块链存储串根据串中存储字符的数量及特点,对一些特殊的串进行了命名空串:存储0个字符的串,如 str = ""(双引号紧挨着)空格串:只包括空格的串,如 str = " "(双引号包括三个空格)主串和子串:子串能在主串中找到,如 str_zi = "abc";str_zhu = "aabc"(子串能在主串中找到若干连续字符与之对应)串的定长顺序存储实际上是用普通数组(又称静态数组,如 char str[3] = "lo")存储#includ原创 2022-03-19 12:34:29 · 2499 阅读 · 3 评论 -
C语言双向链表实现对字符串的存储
双向链表实现字符串的存储—— 头文件结构体声明双向链表节点原创 2022-03-18 19:13:12 · 2408 阅读 · 1 评论 -
(数据结构)利用 C语言实现顺序栈及链栈 —— 2022/3/18
顺序栈及链栈顺序栈—— 头文件构造入栈函数构造展示栈内元素的函数构造出栈函数—— 主函数链栈—— 头文件结构体声明链栈节点构造入栈函数构造展示栈内元素的函数构造出栈函数—— 主函数顺序栈—— 头文件#include <stdio.h>构造入栈函数// 入栈 int push(int *arr, int top, int elem){ arr[++top] = elem; // arr[0] = 1 return top; // 返回新的栈顶位置 0 }构造展示栈内元素原创 2022-03-18 10:31:20 · 1081 阅读 · 0 评论 -
(数据结构)利用 C语言实现双向链表 —— 2022/3/17
双向链表—— 头文件结构体声明双向链表节点构造创建双向链表的函数原创 2022-03-17 01:30:00 · 287 阅读 · 5 评论 -
(数据结构)利用 C语言实现静态链表 —— 2022/3/16
静态链表—— 头文件结构体声明静态链表节点构建创建静态链表的函数(包括备用链表)构造展示静态链表元素的函数构造插入静态链表元素的函数构造删除静态链表元素的函数构造查找静态链表元素的函数构造更新静态链表元素的函数—— 主函数—— 头文件#include <stdio.h>#define maxSize 6结构体声明静态链表节点// 结构体声明静态链表节点typedef struct { int data; //数据域 int cur; // 游标} compon原创 2022-03-16 03:00:00 · 1091 阅读 · 0 评论 -
(数据结构)利用 C语言实现顺序表 —— 2022/3/15
顺序表—— 头文件结构体声明顺序表节点构造创建顺序表的函数构造添加顺序表元素的函数构造展示顺序表的函数构造插入顺序表元素的函数构造删除顺序表元素的函数构造查找顺序表元素的函数构造更新顺序表元素的函数—— 主函数—— 头文件#include <stdio.h> #include <stdlib.h>结构体声明顺序表节点// 声明节点结构typedef struct Table{ int *head; int length; int size;} table;构原创 2022-03-15 13:55:46 · 638 阅读 · 1 评论 -
浅谈 C语言指针和链表 —— 2022/3/14
指针和链表—— 指针—— 链表结构体声明链表节点构造创建链表的函数构造展示链表的函数构造插入链表元素的函数构造删除链表元素的函数构造查找链表元素的函数构造更新链表元素的函数—— 指针此模板浅淡了一点指针的知识(指针的类型,函数中的地址传递…)#include <stdio.h>/* 指针作为函数的形式参数,交换指针对应变量的值才能真正实现地址上的传递 e.g. int temp = *p1; *p1 = *p2; *p2 = temp; 如果交换的是指针的地址,那么仍是原创 2022-03-14 22:45:09 · 2087 阅读 · 0 评论