![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 67
无由頁
这个作者很懒,什么都没留下…
展开
-
数据结构真题
前言部分易错,待补充正文串相关2004年利用串的基本运算,编写一个算法删除串s1中的所有s2子串2005年求串s1和s2的最长公共子串长度,并返回该子串在s1中的起始位置2006将任何输入的字符串中的最长单词输出,并计算出其在字符串中的位置求串s中出现的第一个最长重复子串及其位置并分析算法的时间复杂度2007设s为一个长度为n的字符串,其中串的字符各不相同,计算s中互异的非平凡子串的个数2008编写一个函数判断s2是否是s1的子串链表相关2003单链表顺序表实现约瑟夫环jo原创 2020-10-10 14:48:48 · 1255 阅读 · 0 评论 -
kruskal算法的简单正确性证明
前言算法都会用,证明不一定理解正文令G为任何一个与kruskal算法产生的树T1不同的树,是否有G比T1更优呢?首先考虑在T1的构造过程,令E为第一次选的一条不属于G的边,如果我们将E加入G,我们就会得到一个环C,这个C不完全包含于F内,故C存在一条不属于T1的边F,如果我们将E加入G并删除F,则得到一个新树T2。证明T2比G优,即证明E比F优,利用反证法,假设F比E优.在T1中kruskal算法选中了E而不是F的唯一原因只能是,F被排除了,即加入F会令T1成环。由于E是第一次选择的不属于G的原创 2020-09-26 09:48:47 · 2416 阅读 · 3 评论 -
数据结构——单链表与顺序表的插入排序(简洁)
前言复习排序一章时,对比回顾单链表与数组的不同写法正文顺序表网上详解资料太多了void insertSort(int *arr,int len){ int tmp,i,j; for (i = 1;i < len;i++) { tmp = arr[i]; //保存待排序的此数 for (j = i - 1;j >= 0 && arr[j] > tmp;j--) //从后往前查找 { arr[j + 1] = arr[j]; //向后挪位原创 2020-08-08 00:47:23 · 734 阅读 · 0 评论 -
数据结构习题——共享栈的入栈Push和出栈Pop/双栈模拟队列
前言关于共享栈正文题目共享栈的入栈和出栈操作共享栈特点栈满top1-top0=0栈空top0=-1,top1=maxsize;左边入栈出栈和右边入栈出栈top移动相反(具体见代码)代码#define maxsize 100typedef struct{ int stack[maxsize]; int top[2];}stk;stk s;//入栈操作int push(int i,int x){ if(i<0||i>1){ printf("栈号不对");原创 2020-06-10 16:46:55 · 1210 阅读 · 0 评论 -
数据结构习题——将链表L(a1,a2,a3,...,an-2,an-1,an)改造成(a1,an,a2,an-1,a3,an-2,...)
前言王道2019统考真题正文题目设链表L(a1,a2,a3,…,an-2,an-1,an)采用头结点的单链表保存请设计一个空间复杂度为O(1)时间上尽可能高效的算法,重新排列L,得到线性表变成(a1,an,a2,an-1,a3,an-2,…)关键先找出链表L的中间点,为此设置了两个指针p和q,指针p每次走一步,q每次走两步,当指针q达到链尾时,指针p正好在链表的中间点然后将L的后半部分原地逆置从单链表前后两段中以此各取一个结点,按要求重排这道题涉及了链表的双指针法,链表的逆置,链表的原创 2020-06-09 21:24:18 · 6404 阅读 · 3 评论 -
数据结构——删除重复结点仅保留第一次出现的结点(空间换时间案例)
前言王道2015统考真题正文题目用单链表存储m个整数,要求设计一个时间复杂度尽可能高效的算法,删除链表中的data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。代码关键:空间换时间,创建一个数组(初始化0),记录已出现的数值(变成1),从而只进行一趟扫描。 void func(Linklist h,int n){ LNode *p=h,r; int *q,m; q=(int *)malloc(sizeof(int)*(n+1));//申请n+1个辅助空间 for原创 2020-06-09 21:01:03 · 523 阅读 · 0 评论 -
数据结构习题——判断二叉树是否为二叉排序树/判断二叉树是否为平衡二叉树(C语言)
前言二叉树的应用:二叉排序树和平衡二叉树正文题目一判断二叉树是否为二叉排序树关键:二叉排序树中序遍历后的结果序列为递增题目二判断二叉树是否为平衡二叉树关键:平衡二叉树的左右子树的高度差不大于1...原创 2020-05-28 22:19:20 · 8385 阅读 · 5 评论 -
数据结构习题——由先序和中序建立二叉树/已知先序求后序序列
前言正文题目一设一颗二叉树各结点的值互不相同,其先序遍历序列和中序遍历序列分别存在两个一维数组A[1…n]和B[1…n]中,试编写算法建立该二叉树的二叉链表根据先序序列确定树的根结点根据根结点在中序序列中划分出二叉树的左、右子树中包含哪些结点,然后根据左、右子树结点在先序序列中确定子树的根结点,即返回步骤1//初始值l1=l2=1,h1=h2=nBiTree PreInCreate(int a[],int b[],int l1,int h1,int l2,int h2){ BiTNode原创 2020-05-23 23:48:04 · 2367 阅读 · 0 评论 -
数据结构习题——查找链表中导数第K个位置上的结点
前言单链表,2009正文题目设计一个尽可能高效的算法:查找链表中导数第K个位置上的结点(K为整数)思路:双指针法:p,q当p移动到第K个结点时,q与p同步移动当p移动到最后一个结点时,q指向第k个结点int search_k(LinkList L,int k){ LNode* p=L->next,*q=L->next; int count=0; while(p!=NULL){ //遍历直到最后一个结点 if(count<k) //count<k只移动p原创 2020-05-20 23:20:06 · 213 阅读 · 0 评论 -
数据结构习题——判断一个数据序列是否构成一个小根堆/编写简单选择排序的单链表版
前言关于选择排序正文题目一判断一个数据序列是否构成一个小根堆前提需知,一个“堆”是一颗“完全二叉树”(编号从1…n的完全二叉树存储结构的数列)故利用以下性质解题:当i>1时,结点i的双亲结点为i/2(向下取整)当2i<=n时,结点i的左孩子编号为2i当2i+1<=n时,结点i的右孩子编号为2i+1判断是否为小根堆,只要满足双亲结点的左右孩子均小于该结点即可。//数组a[1...n]bool judge(int a[],int n){ if(n%2==0){原创 2020-05-14 17:12:21 · 3458 阅读 · 2 评论 -
数据结构习题——荷兰国旗等快排相关
前言关于排序正文关于快排的一些题目题目一顺序存储的线性表,设计把所有奇数移动到偶数前面的算法(要求时间最少,辅助空间最少)void move(int a[],int n){ int low=0,high=n-1; int i=low,j=high; while(i<j){ while(i<j&&a[i]%2!=0)i++;//找到偶数 while(i<j&&a[j]%2==0)j--;//找到奇数 if(i<原创 2020-05-12 18:41:32 · 316 阅读 · 0 评论 -
数据结构习题——双向冒泡排序编写
前言关于排序正文借此回顾一下冒泡排序题目编写双向冒泡程序,第一趟把数字大的放后面,第二趟把数字小的放前面,往复直到排序完成low,high两个工作指针,一个从头部遍历,一个从尾部遍历,当相遇时或flag=0时排序完成。先从前往后冒泡排序,把数字大的放在后面,high–然后从后往前冒泡排序,把数字小的放在前面,low++void BubbleSort(int a[],int n){ int low=0,high=n-1; int i,j,flag=1; while(low<hig原创 2020-05-12 17:48:49 · 859 阅读 · 2 评论 -
数据结构习题——输出从u到v所有简单路径
前言这道题开始一直不太理解,记录下来,水平有限,有错误请斧正。正文题目一输出从u到v所有简单路径f是得到下一个firstarc的意思,黑色弧线代表递进,蓝色弧线代表回溯。补充:一边回溯一边把结点visited置为0;void FindPath(AGraph *G,int u,int v,int path[ ],int d){ int w,i; ArcNode *p;...原创 2020-05-06 17:14:03 · 3634 阅读 · 14 评论 -
数据结构习题——DFS非递归/判断一个无向图G是否为一颗树
前言日常输出一些题目正文题目一:编写DFS非递归void unrc_DFS(ALGraph G,int v){ ArcNode *p; initStack(s); visited[v]=true; push(s,v); while(!isEmpty(s)){ pop(s,p);visit(p);//弹出栈顶结点并访问 p=G.vertices[v].firstarc ...原创 2020-05-03 23:21:54 · 930 阅读 · 0 评论 -
图的遍历:DFS/BFS
前言还是自用版,选择一套简洁的自己记忆下来正文首先是存储结构,一般常用到的是邻接矩阵和邻接表。#define MaxSize 100;typedef char VertseType;typedef int EdegeType;typedef struct{ VertseType Vex[MaxSize];//顶点信息表 EdegeType Edge[MaxSize]...原创 2020-05-03 22:16:25 · 230 阅读 · 0 评论 -
数据结构习题目录+思维导图
前言一个目录,关于二叉树的相关题目正文二叉树遍历相关统计二叉树度为0结点数统计二叉树度为1结点数统计二叉树度为2结点数计算二叉树的高度计算二叉树的深度从二叉树中删去所有叶节点...原创 2020-04-30 12:56:11 · 428 阅读 · 0 评论 -
数据结构习题——计算指定结点*p所在的层次/先序输出结点及其所在层次
前言王道归纳习题正文计算指定结点*p所在的层次说到找层次,第一个想到的是层序遍历,但这个用递归来写就简单很多,还有一个就是,找层次和计算二叉树的深度有类似,需要加了一个判断两结点是否相等的判断条件。递归int getLever(BiTree T,BiTNode *p){ if(T==NULL) return 0; if(T->data==p->data) return ...原创 2020-04-30 12:51:15 · 3841 阅读 · 5 评论 -
数据结构——交换每个结点的子女/计算各结点最大值元素
前言两道比较简单的题目,同时也是王道习题后面的重点归纳题,所以还是记录下来正文题目一:交换每个结点的子女void swap(BiTree T){ int t; if(T==NULL) return; swap(T->lchild); swap(T->rchild); t=T->lchild; T->lchild=T->rchild; T->...原创 2020-04-29 23:50:20 · 226 阅读 · 0 评论 -
数据结构习题——二叉树叶子结点的删除/删除以元素X为根的子树
前言关于结点的删除例题,两道题目又类似的地方,一起记录下来。正文题目一:二叉树叶子结点的删除之前我认为的是,只要free()掉叶子结点就可以了,但是为了避免野指针的出现,我们还需要将指向叶子结点的双亲的左右指针置为NULL!代码void Del_0(BiTree T) //删除叶子结点{ BiTNode *p = T; if ((p->lchild == NULL &am...原创 2020-04-29 13:32:06 · 3303 阅读 · 6 评论 -
数据结构习题——求二叉树度为0和度为1的结点数
前言求二叉树不同度的结点数数正文题目一:统计二叉树中度为1的结点递归int getOne( BiTree T){if(T==NULL) { return 0; } if(T->lchild==NULL&&T->rchild!=NULL||T->rchild==NULL&&T->lchild!=NULL){...原创 2020-04-28 22:49:26 · 3307 阅读 · 0 评论 -
数据结构习题——求双分支结点数/判断两树是否相似
前言王道二叉树习题9正文计算一颗二叉树T中所有双分支结点数f(T)=0 若T=NULLf(T)=f(T->lchild)+f(T->rchild)+1 若T为双分支结点f(T)=f(T->lchild)+f(T->rchild) 其他情况如果一个根结点左右子树都不为NULL,进入第二种情况,再递归判断它的左右子树是否为双分支...原创 2020-04-27 23:28:40 · 645 阅读 · 3 评论 -
数据结构习题——打印值为X结点所有祖先和最近公共祖先问题
前言学习不要着急,递归加强练习,慢慢从题目中找到写二叉树递归函数的感觉正文一、打印值为X结点所有祖先,假设x的结点不多于1个/*结构体声明*/typedef struct BiTNode{ struct BiNode *lchild,*rchild; int data;// int tag;}*BiTree,BiTNode; 递归bool Ancestors(BiTree ...原创 2020-04-27 22:34:22 · 2752 阅读 · 1 评论 -
数据结构习题——求二叉树的深度与宽度
前言题目来自王道数据结构一书,归纳一下正文求二叉树的深度递归原创 2020-04-27 17:19:18 · 4306 阅读 · 2 评论 -
二叉树遍历简洁版:先序、中序、后序和层次遍历
前言关于二叉树的递归确实很头疼,记录下来。正文先序遍历。将根节点入栈,考察当前节点(即栈顶节点),先访问当前节点,然后将其出栈(已经访问过,不再需要保留),然后先将其右孩子入栈,再将其左孩子入栈(这个顺序是为了让左孩子位于右孩子上面,以便左孩子的访问先于右孩子;当然如果某个孩子为空,就不用入栈了)。如果栈非空就重复上述过程直到栈空为止,结束算法。中序遍历。将根节点入栈,考察当前节点(即...原创 2020-04-23 22:55:54 · 138 阅读 · 0 评论 -
数据结构习题2.2.4:设计递归算法删除不带头结点的单链表L中所有值为x的结点
前言本题是运用递归解决问题正文不带头结点的单链表L中所有值为x的结点/*删除链表中的x结点(递归)*/ void del_x(LNode *L,int x){ LNode *p; if(L->next=NULL) return; else if(L->data=x){ p=L; L=L->next;//这里L为调用该函数的外层L->next(就是...原创 2020-04-12 23:24:01 · 816 阅读 · 2 评论 -
数据结构学习:单链表——归并例题
前言几天没写了,开始看数据结构啦,经过了前一两个月的学习C语言,对C有了更深刻的认识,但还有许多地方需要加强,后面还要复习。现在看数据结构第一块,线性表这块,还是有必要抽出时间来整理所学的。正文总结:关于归并问题,一般都要利用两个指针分别遍历两个链表。然后判断两个指针所指数据的状况,让其中一个指针移动,循环直到有一方的指针到尾。问题一:假设有两个按元素值递增次序排列的线性表,均以单链表形...原创 2020-04-09 23:41:17 · 354 阅读 · 0 评论