![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
黑胡子大叔的小屋
嵌入寺点灯大师
展开
-
C算法相关整理
单链表相关算法求交集并集//求并集void Union(NODE l1,NODE l2){ /** * 实现思路1: * 1、将结果链表置空 * 2、将l1节点插入结果链表 * 3、遍历l2所有节点,有则跳过,无则插入 * * 实现思路2: * 1、p1指向l1第一个节点,p2指向l2第一个节点 * 2、比较p1和p2值,小的插入结果链表,并指针后移,直到p1或p2为空 * 3、之后再将p1\p2不为空原创 2021-12-12 23:36:08 · 415 阅读 · 0 评论 -
数据结构排序算法
/** * @file testsqlist.c * @brief 实现排序 * * @author UncleBb * @version 0.0.0.1 * @date 2021/12/10 */#include <stdio.h>#define MAX_LEN 20struct ARRAY_LIST{ int index; int data[MAX_LEN];原创 2021-12-10 23:19:15 · 590 阅读 · 0 评论 -
数据结构算法练习
数据结构与算法栈部分顺序栈#include<stdio.h>#include<stdlib.h>#include<string.h>#define MaxSize 10typedef struct arraystack{ int Data[MaxSize]; // 存储元素的数组 int topIdx; //栈顶指针}Node;//入栈void push(struct arraystack *node,int valu原创 2021-06-10 15:08:36 · 400 阅读 · 1 评论 -
排序算法
冒泡#include<stdio.h>int main(){ int num_array[10]={7,6,5,4,2,1,10,3,8,9}; for (int i = 0; i < 10; i++) { printf("%d\n",num_array[i]); } /** * 冒泡排序: * 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的原创 2020-09-22 17:43:36 · 126 阅读 · 0 评论 -
二分查找测试
小记二分查找实现思想:https://blog.csdn.net/qq_42680327/article/details/81734842?biz_id=102&utm_term=C%E5%AE%9E%E7%8E%B0%E6%8A%98%E5%8D%8A%E6%9F%A5%E6%89%BE&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-81734842&spm=1018原创 2020-09-18 16:34:36 · 431 阅读 · 0 评论 -
二叉树算法题整理(四)
题目一写出在中序线索二叉树中结点p的右子树中插入一个结点s的算法代码void insert(BiThrNode p,BiThrNode s){ BiThrNode *p,*s; if(p->rtag==1) //无右子树,则有右线索 { s->rchild=p->rchild; s->rtag=1; p->rchild=s; p-&g...原创 2019-11-18 22:17:56 · 735 阅读 · 0 评论 -
图的习题整理(一)
题目设计一个算法,判断无向图G是否连通,连通返回1,否则返回0思想首先初始化一个结点数组为0;然后遍历一遍将遍历到的结点数组改为1;最后在遍历一遍结点数组,若有结点为1则返回flase,否则返回true代码bool connect(AIGraph *G){ int i; bool flag=true; for(i=0;i<G->n;i++) visit[i]=0;...原创 2019-11-16 23:15:50 · 627 阅读 · 1 评论 -
二叉树应用题整理(一)
题目将下列森林转换为相应的二叉树,并分别按以下说明进行线索化:(1)先序前驱线索化;(2)中序全线索化前驱线索和后继线索;(3)后序后继线索化。思想第一问的前驱线索化下图相关画全线索二叉树时,虚线是指向结点前驱,实线指向后继。解答...原创 2019-11-15 20:22:27 · 1237 阅读 · 0 评论 -
二叉树习题整理(三)
题目一编写算法判别给定二叉树是否为完全二叉树代码Status T649(BiTree T){ int i,j; BiTree p[100]={}; //数指针数组,模拟队列 int order[100]={}; i=j=0; if(T) { p[j]=T; order[j]=1; //遍历的同时为结点编号 j++; while(i<j) ...原创 2019-11-13 23:05:49 · 750 阅读 · 0 评论 -
二叉树习题整理(二)
题目一编写递归算法,求二叉树中以元素值为x的结点为根的子树的深度思想先递归找出x的位置,用p指向,然后找到子树的深度(求树的深度的思路:1、如果树为空,则深度为02、如果树不是空,那么深度是左子树的深度+1或右子树的深度+)代码int T644(BiTree *T,TElemType x){ BiTree p; p=locationBiTree(T,x); //第一个递归找出x...原创 2019-11-12 22:26:01 · 665 阅读 · 1 评论 -
简述题(数据结构)
简述题数据结构重点研究“数据”还是“结构”重点研究结构。数据结构是一门研究非数值计算的程序设计问题中计算机操作对象(即数据元素)以及他们之间的关系和运算的学科。如何合理组织高效处理数据是数据结构主要研究问题。线性表的存储结构胶顺序表,线性表的链式存储结构叫链表,请简述你对“顺序表顺序存储、随机读取;链表随机存储、顺序读取”这句话的理解顺序表的存储位置是一片连续的区域,可以根据下标进行随机读...原创 2019-11-11 21:24:04 · 5941 阅读 · 4 评论 -
二叉树习题整理(一)
题目一编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值思想声明一个order用来计数,先序遍历,每遍历一个结点order+1,然后判断k是否等于order,等于则将结点的值域赋给e代码Status T641(BiTree T,TElemType *e, int *order,int k){ if(T) { (*order)++; if(*order==k) ...原创 2019-11-11 20:42:51 · 401 阅读 · 0 评论 -
单链表习题整理(六)
题目已知有一个单项循环链表,其每个结点含三个域:prior,data和next,其中data为数据域,next为指向后继结点的指针域,prior也为指针域,但它的值为空,试编写算法将此单向循环链表改为双向循环链表,即使prior称为指向前驱结点的指针域思想循环单链表使其每个结点的prior指向上一个结点即可代码Struct LinkList* T(sturct LinkList *hea...原创 2019-11-06 20:11:51 · 402 阅读 · 0 评论 -
单链表习题整理(五)
题目已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度思想代码...原创 2019-11-06 19:27:49 · 258 阅读 · 0 评论 -
单链表习题整理(四)
题目已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)思想首先排除两个错误的情况:1、L为空或不存在,2、mink>maxk其次问题是删除结点,循环整个...原创 2019-11-06 19:07:38 · 818 阅读 · 0 评论 -
四种存储结构及其特点
存储结构数据元素之间的关系在计算机的存储有四种表示方法,分别是顺序存储、链式存储、索引存储、哈希存储。特点顺序存储数据元素顺序存放,每个结点只有一个元素。存储位置反映数据元素间的逻辑关系。存储密度大,但是插入、删除操作效率较差。链式存储每个结点除了包含数据元素信息外还包含一组指针,指针反映数据元素间的逻辑关系。这种存储方式不要求存储空间连续,便于进行插入和删除操作,但是存储空间利用率较...原创 2019-11-06 16:06:01 · 14238 阅读 · 0 评论 -
单链表习题整理(三)
题目试写一算法,在无头结点的动态单链表上实现线性表操作INSERT(L, i, b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。思想这个题目非常简单,关键在于是否注意到无头结点,无头结点的动态单链表插入在1位置区分一下,其他都是循环找到前一个结点,用q指向,然后插入 p->next=q->next;q->next=p;代码Status T217(...原创 2019-11-05 21:12:30 · 531 阅读 · 0 评论 -
单链表习题整理(二)
题目已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中的第j个元素之前。思路在la中查找第i个结点,用p标记当前结点,有prep标记当前结点的前一个结点;删除这前p个结点,即将prep的next指向其他结点;又插入到表第j个元素之前,即指向lb中第j个元素,lb指向p,注意是无头结点的单链表,因此第一个结点处...原创 2019-11-05 19:41:31 · 2359 阅读 · 0 评论 -
基数排序
基数排序基数排序是一种很特别的排序,是基于多关键字的排序。借助“分配”和“收集”两种操作实现对单逻辑关键字排序。基数排序又分为最高位优先(MSD)和最低位优先(LSD)。例完成第一次的“分配”和“收集”就实现了对个位的排序完成了第二次就实现了对十位的排序性能分析...原创 2019-11-04 23:10:01 · 130 阅读 · 0 评论 -
归并排序
归并排序原理假设初始序列含有n个记录,可以看成是n个有序子序列,每个子序列的长度都是1,然后两两归并,得到n/个长度为2或1的有序子序列;再两两归并…如此重复,知道得到一个长度为n的有序序列,这种排序方法称之为2路归并排序。其过程很像一个倒过来的二叉树例...原创 2019-11-04 22:55:07 · 98 阅读 · 0 评论 -
什么是稳定的排序方法
什么是稳定的排序方法稳定的排序方法设关键字Ki=Kj,且排序前的序列中Ki领先于Kj,若排序后Ki仍然领先于Kj,则称这个排序方法是稳定的不稳定排序:快速排序、希尔排序、堆排序稳定排序:冒泡排序,直接插入排序、归并排序、基数排序不确定:简单选择排序(插入版稳定,交换版不稳定)...原创 2019-10-30 21:41:27 · 14116 阅读 · 0 评论 -
平衡二叉树的调整整理
平衡二叉树的调整整理相关概念平衡二叉树平衡二叉树又称AVL树,特点是它的左子树和右子树都是平衡二叉树,而且左子树和右子树的深度之差不超过1平衡因子二叉树结点上左子树的深度减去右子树的深度,平衡二叉树的平衡因子只可能是-1、0、1最小平衡子树以距离插入结点最近的,平衡因子绝对值大于1的结点为跟的子树平衡二叉树的调整部分平衡二叉树的调整分为LL、RR和LR、RL两种,其中LL、RR...原创 2019-10-30 21:33:31 · 1307 阅读 · 0 评论 -
选择排序整理
选择排序整理简单选择排序思想每一趟从无序队列中选一个最小的,插入有序队列,时间复杂度为O(n²)堆排序堆堆是一颗完全二叉树,而且满足任何一个非叶子结点的值都不大于(或者不小于)其左右孩子结点的值不小于称这个堆为大顶堆不大于称这个堆为小顶堆堆的筛选总结为两句:【从下而上,从右到左】例设待排序的关键字序列为{13,7,16,45,36,27,17,6,12,56},试分别完成...原创 2019-10-30 21:17:35 · 140 阅读 · 0 评论 -
线性表习题整理(二)
线性表习题整理(二)题目已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法和时间复杂度思想根据给定的两个链表的长度选择较短的链表并找到其尾结点,注意释放教程链表的头结点代码段...原创 2019-10-29 22:22:13 · 704 阅读 · 0 评论 -
单链表习题整理(一)
单链表归并题目已知两个链表A和B分别表示两个集合,元素递增排序。编制函数,求A和B的交集,并存放于A链表中思想归并实现,设置两个工作指针分别对应两个链表,分别遍历两个链表,当元素相同时才保留且保留一个,其他结点释放。当一个链表遍历完成后,释放另外一个链表。代码段void intercectLNode(LNode *&A,LNode *&B){ LNode *PA,*...原创 2019-10-28 22:49:49 · 381 阅读 · 0 评论 -
二叉树习题整理(一)
求二叉树的叶子结点个数分析这个题目很简单,我想到了两个思路1、跑一遍二叉树的先序遍历,每个结点判断是否有左孩子和右孩子,若都没有Count+12、利用递归的思想,每个结点都进行同样的判断:判断是否有左孩子或右孩子,若都没有Count+1,若有则针对左右孩子递归调用1的代码段#define MAX_NODE 50;int SearchLeavesNode(BTNode *T){B...原创 2019-10-25 21:50:30 · 360 阅读 · 0 评论 -
二叉树的遍历(非递归)整理
二叉树的遍历(非递归)写在前面二叉树重要,重要,重要。以下代码每日手撸一遍,深刻理解。二叉树的先序遍历(非递归)巧记心法判断是否为空树1、右侧入栈(访问,q指向右孩子,不空则入栈)2、p指向左孩子,为空则弹栈#define MAX_NODE 50;void preorderTraverse(BTNode *T){BTNode *stack[MAX_NODE],*p=T,*q...原创 2019-10-25 21:21:28 · 327 阅读 · 0 评论 -
二叉树与树的相互转化
二叉树与树的相互转化树转化为二叉树加线,在所有兄弟结点之间加线去线,对树中每个结点只保留与它第一个孩子结点的连线,删除与其他孩子结点之间的连线其中每个结点左指针指向她的第一个孩子结点,右指针指向他在树中的相邻兄弟结点,由于根节点没有兄弟,因此由树转换而得的二叉树没有右子树由二叉树转化到树加线,若该结点存在做孩子,则将该结点与该结点的n个有孩子结点相连(即只要这个结点有左子...原创 2019-10-24 23:39:09 · 17488 阅读 · 5 评论 -
普里姆(Prim)算法
普里姆(Prim)算法普里姆(Prim)算法思想普里姆(Prim)算法是一某个顶点为起点,逐步找各顶点最小权值的边来构建最小生成树。换一种说法:从任意一顶点 v0 开始选择其最近顶点 v1 构成树 T1,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止。举例下面一张无向网图我们以V0为根结点,找到与V0相邻的结点中权值最小的V6再从当前树中...原创 2019-10-21 23:39:50 · 7893 阅读 · 0 评论 -
克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔(Kruskal)算法最小生成树一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 [1] 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。“最小生成树”百度词条构造最小生成树的算法的基本原则尽可能选取权值最小的边,但不能构成回路选择n-1条边构成最小生成树克鲁斯卡尔算法思...原创 2019-10-21 21:54:35 · 3249 阅读 · 1 评论 -
二叉树部分整理(二)
二叉树存储结构及其遍历存储结构顺序存储定义:就是用一组地址连续的存储单元自上而下,从左到右存储完全二叉树上的结点(参考的完全二叉树,对于一般的非完全二叉树,也是按照完全二叉树的存储方式存储)链式存储(数据域+指向该结点的左右孩子指针)二叉链表三叉链表就是外加一个指向双亲结点的指针二叉树遍历先序遍历递归1、判断是否为空,为空什么也不做,否则执行下面2、访问根结点3、...原创 2019-10-21 10:55:41 · 183 阅读 · 1 评论 -
深度优先遍历算法
深度优先遍历算法深度优先遍历算法思想声明一个工作指针声明一个辅助队列,初始化为false循环套循环递归循环一:循环访问定点表,当visited=false(即顶点未被访问)时,执行DFS(G,v);DFS:访问v,设置v的访问标志,工作指针p指向邻接表第一个结点,当p不为空循环DFS,p指向邻接表的下一个结点注深度优先遍历类似于树的先序遍历...原创 2019-10-19 22:28:11 · 2430 阅读 · 0 评论 -
广度优先遍历算法
广度优先遍历算法广度优先遍历算法思想声明一个辅助队列,并将其初始化为false声明一个工作指针p声明一个int v用于记录顶点表声明一个int w用于记录邻接表循环套循环套循环循环一:访问顶点表,当visited=false(即顶点未被访问),入队循环二:当队列不空,从队列中取一个顶点,设置访问标志,令工作指针p等于边表头指针循环三:当p不为空,若该边只想的顶点没访问,入队,p...原创 2019-10-18 21:48:48 · 796 阅读 · 0 评论 -
二叉树部分整理(一)
二叉树定义及特殊二叉树定义1、每个结点最多有两颗子树2、左右子树有顺序3、即使树中某个结点只有一颗子树,也要区分它是左子树还是右子树二叉树的五种基本形态1、空二叉树2、只有一个根结点3、根结点只有左子树4、根结点只有右子树5、根结点有左子树和右子树特殊二叉树斜树:只有左斜树或右斜树满二叉树1、所有分直接点都存在左子树和右子树2、所有叶子都在同一层上完全...原创 2019-10-18 17:24:08 · 766 阅读 · 0 评论 -
树部分整理(二)
树的实现顺序存储双亲表示法(结点:结点数据+结点双亲数组下标,树:结点数组+结点数量)定义用一组连续的存储空间存储树的结点,同时在每个结点中,用一个变量存储该结点的双亲结点在数组中的位置特点双亲表示法可以根据parent值找到该节点的双亲结点,时间复杂度为O(1)例链式存储孩子表示法定义把每个结点的孩子结点排列起来存储成一个单链表。所以n个结点就有n个链表;如果是...原创 2019-10-18 17:17:55 · 122 阅读 · 0 评论 -
树部分整理(一)
树的定义性质部分相关概念结点有且只有一个根结点结点的度:拥有的子树的数量(即分支的数量)度为0:叶子结点或者终端结点,度不为0:分支结点或非终端结点,分支结点中除去根节点的称为内部结点结点之间的关系,祖先结点、子孙结点、双亲结点、孩子结点、兄弟结点层次、高度、深度、树的高度层次:跟为第一层,它的孩子为第二层,以此类推高度:叶节点开始【自底向上累加】深度:根结点开始【自顶向...原创 2019-10-18 17:14:04 · 121 阅读 · 0 评论 -
队列部分整理
队列队列特点先进先出一端插入一端删除顺序存储(对头指针+队尾指针+存放队列元素)定义设置一个队首指针front,一个对位指针rear,分别指向对首和队尾元素示意图操作初始化:front=rear=0判断空:front=rear判断满:rear=MAX_QUEUE_SIZE-1或者front=rear入队:新元素插入到rear所指的位置,然后rear+1出队:删...原创 2019-10-16 23:10:51 · 594 阅读 · 0 评论 -
栈部分整理(三)
栈的应用进制转换进制转换数学思想假设将十进制V转化为二进制,将V除2得余数,再商除2得余数最后一直除到0然后余数倒序输出即是转化的数算法思想1、分析循环条件:商>02、循环体要实现的东西:每次取余,作商3、循环弹栈括号匹配问题算法思想设置一个栈,读到左括号时进栈,读到右括号时弹出元素与读到的右括号配对,若匹配成功,继续读入,否则返回FALSE,最后判断栈是否...原创 2019-10-16 22:58:59 · 162 阅读 · 0 评论 -
栈部分整理(二)
链式栈(链式存储)定义内容(栈中元素data+栈顶指针)栈是线性表的特例,线性表的存储结构还有链式存储,所以也可以用链表的方式实现栈。栈的链式存储叫做链栈。每个单链表都有头指针,对于链栈也是必须的,将头指针作为栈顶指针注意链栈一般不存在栈满的情况链栈一般不存在栈满的情况例操作链栈压栈(元素进栈)思想1、申请新的栈结点(Stack_Node)p,若申请失败,返回f...原创 2019-10-16 22:47:06 · 120 阅读 · 0 评论 -
栈部分整理(一)
顺序栈(顺序存储)定义内容栈:只允许一段进行插入或者删除操作的线性表栈顶:栈中允许进行插入和删除的那一端栈底:固定的,不允许进行插入和删除的另一端分类根据数组是否可以根据需要增大可以分为【静态顺序栈】和【动态顺序栈】静态顺序栈(存储元素的数组+栈顶指针)采用静态一维数组来存储栈栈底固定不变的;栈顶则随着进栈和退栈操作而变化,用一个整型变量top(称为栈顶指针)来指示...原创 2019-10-16 22:38:49 · 647 阅读 · 0 评论