数据结构与算法
文章平均质量分 54
内容中的图来自大话DS,部分图个人进行一定的整合修改
Uncertainty!!
学无止境!
展开
-
数据结构入门框架
数据结构逻辑框架原创 2024-03-26 21:50:23 · 238 阅读 · 0 评论 -
数组的存储结构、特殊矩阵和稀疏矩阵的压缩存储
图解数组的存储结构、特殊矩阵和稀疏矩阵的压缩存储原创 2023-11-06 22:23:02 · 616 阅读 · 0 评论 -
链队的练习
c语言实现链队原创 2023-11-05 19:05:28 · 251 阅读 · 0 评论 -
循环队列练习
c语言实现队列顺序结构的初始化、入队、出队、读队头、计算队长度原创 2023-11-05 18:00:27 · 256 阅读 · 0 评论 -
链栈的练习
c语言实现链栈原创 2023-11-04 17:53:49 · 164 阅读 · 0 评论 -
顺序栈练习
c语言简要实现顺序栈原创 2023-11-04 16:47:11 · 201 阅读 · 0 评论 -
顺序表练习
数据结构顺序表练习原创 2023-10-31 12:06:35 · 481 阅读 · 0 评论 -
单链表练习
单链表创建、插入、删除、查找原创 2023-11-01 21:27:00 · 174 阅读 · 0 评论 -
树、森林、二叉树遍历的对应关系
简要理解树、森林、二叉树遍历的对应关系原创 2022-10-13 20:27:05 · 658 阅读 · 0 评论 -
为什么后序遍历二叉树可以求根到某结点的路径?
简要分析为什么后序遍历非递归可以求根到某结点的路径原创 2022-10-09 21:27:10 · 1492 阅读 · 11 评论 -
为什么先序/中序线索二叉树不需要栈的支持,而后序线索二叉树需要栈的支持?
简要分析后序线索二叉树需要栈的原因原创 2022-10-09 20:51:17 · 7136 阅读 · 25 评论 -
中序线索化二叉树的遍历
应用中序线索化二叉树的遍历寻找中序序列中某个结点的前驱或后继原创 2022-10-09 17:18:57 · 1173 阅读 · 0 评论 -
常见选择排序算法
1.常见选择排序算法简单选择排序基本思想:从待排序列中选择一个最小/最大元素,将此元素与当前待排序列的第一个元素进行交换,直到处理完所有元素,如果待排序列中只剩一个元素,则无需处理#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>//选择待排序列中最小的元素//将此元素与待排序列第一个元素进行交换//重复以上操作直到下标i=min//注意如果待排序列中只剩一个元素则无需处理void SelectionSort(int a[],int原创 2022-05-17 21:31:49 · 235 阅读 · 0 评论 -
常见交换排序算法
常见交换排序算法算法可视化互动网站:ComparisonSort1.1 冒泡排序(未优化)基本思想:从左到右依次比较相邻元素,如果左大右小就进行交换#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>//从前到后依次比较相邻元素,如果不满足左小右大就进行交换(使用中间变量temp)void BubbleSort(int a[], int n) { int i, j,temp; for (i = 1; i <= n; i++)原创 2022-05-13 22:38:18 · 403 阅读 · 0 评论 -
常见插入排序算法
1.常见插入排序算法算法可视化互动网站:Comparison Sorting Visualization1.1 直接插入排序基本思想:将待排关键字放入到已排序的子列中#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>//第一层for:从前往后检查,如果a[i]>a[i+1]则将a[i]放入temp//第二层for:寻找temp的插入位置,并移动元素以腾出空间//最后将temp插入到腾出的位置上void InsertionSo原创 2022-05-13 11:00:16 · 315 阅读 · 0 评论 -
红黑树(Red-Black Tree,RBT)
1.红黑树1.1 什么是红黑树?红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但对之进行平衡的代价较低, 其平均统计性能要强于 AVL 【引用自红黑树】笔记来源于:什么是红黑树,据说红黑树很难理解,看动画5分钟就弄明白原理1.2 为什么要引入红黑树?二叉排序树(BST)、平衡二叉树(AVL)、红黑树(RBT)均用于查找数据元素BST →\rightarrow→ AVL →\rightarrow→ RBTBST →\right原创 2022-05-10 18:00:29 · 625 阅读 · 0 评论 -
折半插入排序
折半插入排序笔记来源:数据结构与算法基础–第14周03–第8章排序3–8.2插入排序2–折半插入排序1.1 查找插入位置时采用折半查找法1.2 折半插入排序算法描述利用折半查找法查找到哨兵的插入位置后进行元素移动,为哨兵的插入腾出空间...原创 2022-05-07 10:14:11 · 309 阅读 · 0 评论 -
判断顺序栈栈满的两种方式
判断顺序栈栈满的两种方式原创 2022-01-05 21:57:36 · 4008 阅读 · 2 评论 -
关于图的例题(邻接矩阵、邻接表、深度遍历、广度遍历、最小生成树)
请写出图的邻接矩阵和邻接表,深度和广度遍历结果,最小生成树的结果1.邻接矩阵详见本人博客:图的存储结构:邻接矩阵2.邻接表详见本人博客:图的存储结构:邻接表3.深度遍历结果:1234657(借助邻接矩阵进行深度遍历,从第一行开始遍历V1的所有邻接点,遇到V1邻接点就跳入邻接点所在行,遍历此结点中未被访问过的邻接点)(递归思想)详见本人博客:图的遍历:深度优先遍历(DFS)4.广度遍历结果:1234567(遍历第一行(结点V1的所有邻接点),遍历完V1的所有邻接点,然后遍历第二行(V.原创 2021-12-27 11:52:57 · 5241 阅读 · 2 评论 -
图解堆排序
图解堆排序笔记来源于:Heap Sort | GeeksforGeeks步骤1.使用所给元素建立初堆2.移动元素使满足大根堆(双亲结点大于孩子结点)3.一旦大根堆建立,我们交换根结点和最后一个结点,并将最后一个结点从堆中删除具体过程将所给元素建立初堆初堆建立完毕交换元素使其成为大根堆(双亲结点大于孩子结点)大根堆建立完成交换根结点和最后一个结点,并将交换后得到的堆中最后一个元素删除最后一个结点删除完成重新调整元素使其成为大根堆大根原创 2021-12-24 16:12:35 · 235 阅读 · 0 评论 -
关于折半查找判定树的例题
一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100}。给出折半查找的判定树,以及查找82、4的过程(依次和哪些元素比较),查找成功时的平均查找长度。原创 2021-12-24 15:26:51 · 2974 阅读 · 4 评论 -
关于哈夫曼树的例题(含哈夫曼树的具体构造过程)
1.设在某通信系统中使用了八个字符,出现频率分别为0.08,0.05,0.1,0.12,0.26;0.18,0.14,0.07,试构造一棵哈夫曼树,给出哈夫曼编码,再写出先、中、后序遍历结果,最后将哈夫曼树转换森林。构造哈夫曼树(结点内容为字符,为方便我们这里直接用字符出现频率代替结点内容)哈夫曼编码遍历结果:先序遍历:0.05、0.07、0.12、0.18、0.08、0.1、0.14、0.26中序遍历:0.05、0.07、0.12、0.18、0.08、0.1、0.14、0.26后序遍历原创 2021-12-24 14:55:26 · 7979 阅读 · 0 评论 -
图解快速排序
图解快速排序笔记来源于:Quick Sort in 4 muniutes选择一个值作为枢轴将枢轴值放置到数组末尾(即枢轴值与数组末尾值交换)遍历数组时遵循以下规则从左侧开始找大于枢轴的第一个值从右侧开始找小于枢轴的第一个值交换以上找到的两个值itemFromLeft 向右递增继续寻找大于枢轴值的元素itemFromRight 向左递减继续寻找小于枢轴值的元素交换此时 itemFromLeft 和 itemFromRight 对应的这两个值当下标 itemFro原创 2021-12-23 10:40:26 · 138 阅读 · 0 评论 -
数据结构练习:深度优先遍历(DFS)和广度优先遍历(BFS)(顺序存储结构)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define MaXInt 32767 //最大权值,代表无穷大#define MVNum 10 //最大顶点数/** 无向图的深度优先遍历*///定义图的结构体typedef struct { //顶点数组 char vex[MVNum]; //边数组(邻接矩阵) int edge[MVNum][MVNum]; //顶点数,边数 int vexnum, edgenum;原创 2021-12-01 18:49:46 · 4928 阅读 · 2 评论 -
数据结构练习:二叉树创建与遍历(函数不返回指针和函数返回指针)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<malloc.h>//定义二叉树结点typedef struct BiNode { //结点数据域 char data; //结点左孩子 struct BiNode* lchild; //结点右孩子 struct BiNode* rchild;}BiNode,*BiTree;//先序创建二叉树void CreateBiTree(BiTree原创 2021-11-20 19:03:22 · 1054 阅读 · 0 评论 -
根据遍历顺序确定二叉树
根据遍历顺序确定二叉树先序遍历确定根(头部)后序遍历确定根(尾部)中序遍历确定左右子树(根的两侧)只有给出(先序、中序)或(后序、中序)才能唯一确定一个二叉树例子:中序遍历顺序为:BDCEAFHG后序遍历顺序为:DECBHGFA由以上两个遍历顺序确定二叉树...原创 2021-11-19 10:42:57 · 873 阅读 · 2 评论 -
结构体初始化、结构体指针、结构体数组
结构体的初始化与使用struct student{ int num; char name[20]; int age;};int main(){ //数据类型为student,该类型的一个变量s struct student s={19,'Wu',22};//结构体初始化 printf("%d %s %d",s.num,s.name,s.age) return 0;}结构体数组struct student{ int num; char name[20]; int age;原创 2021-11-16 20:17:12 · 455 阅读 · 0 评论 -
数据结构练习:单链表
方法一直接使用指针的指针来保存头指针L,避免返回头结点的指针#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<malloc.h>typedef int ElemType;//创建结点结构体typedef struct Node{ //数据域 ElemType data; //指针域 struct Node* next;}LNode, * LinkList;//初始化单链表//函数周期结束后..原创 2021-10-23 19:16:48 · 351 阅读 · 0 评论 -
关于单链表在使用尾插法时为什么要使用尾指针的问题
1.假设不使用尾指针因为这里是单链表,所以如果没有尾指针的话,每次都得从单链表的头结点开始遍历,直到尾结点。在原单链表的尾结点表示为L−>next−>next−>⋯−>nextL->next->next->\cdots ->nextL−>next−>next−>⋯−>next将新增尾结点连接到原单链表尾部时L−>next−>next−>⋯−>next=pL->next->next-&g原创 2021-10-22 20:42:49 · 6049 阅读 · 6 评论 -
一张图理解栈顶指针加加减减的问题
原创 2021-10-22 10:40:08 · 783 阅读 · 0 评论 -
顺序表删除操作中的疑问与解决
顺序表删除操作中的疑问与解决1.完整删除操作代码2.单讨论其中的删除操作3.引出删除操作中出现的疑问4.验证上述疑问5.结论1.完整删除操作代码#include<stdio.h>#include<malloc.h>//#include<string.h>#define N 10//1.定义结构体Book(结点)typedef struct { char id[N]; //书号 char name[N]; //书名 float price; //书价原创 2021-10-11 20:19:55 · 1064 阅读 · 6 评论 -
数据结构练习:顺序表
输入要求输出要求代码运行结果示例完整代码:#include<stdio.h>#include<malloc.h>#define N 10//1.定义结构体Book(结点)typedef struct { char id[N]; //书号 char name[N]; //书名 float price; //书价 }Book; //2.定义顺序表typedef struct{ //数组(存放数据元素,即每本书) Book *elem; //.原创 2021-10-08 17:39:30 · 684 阅读 · 0 评论 -
链表中插入结点时指针变化的顺序问题
链表中插入结点时指针变化的顺序问题错误操作示范:从左向右正确操作示范:从右向左p->next=s;s->next=p->next; //此时的p->next已经指向了结点s,所以不能将其再次赋给s->nexts->next=p->next;p->next=s;...原创 2021-10-08 14:36:15 · 934 阅读 · 1 评论 -
再理解:LNode、*LinkList
再理解:LNode、*LinkList1.LNode给 结构体 struct Node{…} 这个复合数据类型起一个别名 LNode(结构体类型)typedef struct Node{ ElemType data; //数据域 struct Node *next; //指针域}LNode; //LNode为结构体类型(本质为复合数据类型)//typedef struct Node{...} LNode;在使用时//定义指向结点的指针LNode *p; //LNode原创 2021-10-08 12:34:57 · 7144 阅读 · 5 评论 -
结构体与共用体
以下笔记来源于视频:【动画教程】研讨共用体,探究大小端存储模式(C语言)结构体与共用体1.结构体结构体struct per{ char name; int age;};结构体中各成员有各自的内存空间,不管结构体中的成员变量是否被使用,C程序都会给它们分配内存2.共用体为节约内存空间,达到在同一块内存空间中储存不同类型数据的目的,共用体应运而生.使用共用体将多种不同种类型的变量存放到同一段内存单元共用体union persion{ char name; int age;};原创 2021-09-26 22:50:00 · 662 阅读 · 0 评论 -
数据结构课上练习(一)
实验一实验要求:对一维数组中的元素进行逆序排列,请使用函数调用的方式运行结果要求:自然语言描述:1.定义数组int arr[N];2.向数组中填入数字1-10printf("the orignal array is:\n");for(i=0;i<N;i++){ scanf("arr[%d]:%d",&i,&arr[i]);3.调用逆序函数(传入上述数组名)inverse(int arr[]){ int temp,i,j; for(i=0;i<N/原创 2021-09-26 20:32:18 · 255 阅读 · 0 评论 -
归并排序算法
归并排序算法推荐视频:传送门下图来自教材《大话数据结构》1.归并排序的递归算法void MergeSort(SqList *L){ MSort(L->r,L->r,1,L->length);}MSort实现过程//MSort具体实现void MSort(int SR[], int TR1[], int s, int t){ int m; int TR[MAXSIZE+1]; if(s==t) //SR[s]...SR[t]归并排序后放入TR1[s]...TR1原创 2021-09-14 20:46:44 · 132 阅读 · 0 评论 -
堆排序算法
堆排序1.大顶堆和小顶堆堆是具有下列性质的完全二叉树:大顶堆和小顶堆的性质大顶堆:每个结点的值大于等于其左右孩子结点的值双亲结点 ki≥k2ik_i \geq k_{2i}ki≥k2i 其左孩子结点(其中 iii 代表结点在数组中的下标)双亲结点 ki≥k2i+1k_i \geq k_{2i+1}ki≥k2i+1 其右孩子结点1 ≤i≤\leq i \leq≤i≤⌊\lfloor⌊ n2\frac{n}{2}2n ⌋\rfloor⌋ (向下取整)对于有nnn个结点的二叉树,第nnn原创 2021-09-12 21:57:05 · 120 阅读 · 0 评论 -
希尔排序算法
希尔排序算法希尔排序是对直接插入排序的改进希尔排序采取跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序(小的基本在前面,大的基本在后面,不大不小基本在中间)的而不是局部有序下标为0处为空,将9和3作比较,9 >\gt> 3,3移动至下标0处关键字9和关键字3之间“相距增量”为4关键字9移动至下标5处,关键字3移动至下标1处关键字1 <\lt< 关键字7不交换关键字8 >\gt>原创 2021-09-11 18:02:27 · 180 阅读 · 0 评论 -
直接插入排序
直接插入排序待排序序列{5,3,4,6,2}void InsertSort(SqList *L){ for(int i=2; i<=L->length; i++){ if(L->r[i] < L->r[i-1]){ //将L->r[i]插入有序子表 L->r[0]=L->r[i]; //将r[i]移动至r[0] for(int j=i-1; L->r[j] > L->r[0]; j--) L-&g原创 2021-09-11 15:43:12 · 87 阅读 · 0 评论