数据结构
文章平均质量分 76
c语言版本
晓晓是个打字员
这个作者很懒,什么都没留下…
展开
-
《数据结构》笔记(上)
1.用语句的频度来分析算法的时间复杂度。语句的频度是指语句在算法中被重复执行的次数。2.空间复杂度是指该算法所耗费的存储空间。算法原地工作是指算法所需的辅助空间为常量。3.线性表是:具有相同数据类型的N个数据元素的有限序列。线性表的顺序存储,又称为顺序表。顺序表:用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素,在物理位置上也相邻。顺序表最主要的特点是随机访问,即通过首地址和元素序号,就可以在O(1)时间内找到指定的元素。顺序表的存储密度高,每个节点只存储数据原创 2021-04-17 18:53:00 · 167 阅读 · 1 评论 -
邻接表的深度优先算法
Question:图采用邻接表形式存储,要求写出图的深度优先搜索(DFS)的非递归算法。//借助栈;bool visited[VER_TEX_NUM];void DFSTraverse(Graph G,int v){ InitStack(S); for(i=0;i<G.ver_num;++i){ visited[i] =false; } Push(S,v); visited[v]=true; whil原创 2020-09-08 18:51:51 · 505 阅读 · 0 评论 -
DFS:深度优先搜索
//DFS:深度优先搜索,类似于树的先序遍历;//递归算法,需要借助递归工作栈;bool visited[MAX_VERTEX_NUM]; void DFSTraverse(Graph G){ for(v=0;v<G.vexnum;++v){ visited[v]=false; } for(v=0;v<G.vexnum;++v){ if(!visited[v]){ DFS(G,v); .原创 2020-09-08 18:18:27 · 114 阅读 · 0 评论 -
BFS:图的广度优先遍历
//图的广度优先遍历(BFS):类似于二叉树的层序遍历算法;//访问顶点v,接着访问顶点v的所有邻接顶点(未访问);然后再循环,知道所有的顶点都被访问过为止;//借助队列,来记录当前访问的顶点bool visited[MAX_VERTEX_NUM];void BFSTraverse(Graph G){ for(i=0;i<G.vexnum;++i){ visited[i]=false; } InitQueue(Q); for(i=0;i<.原创 2020-09-08 17:09:32 · 138 阅读 · 0 评论 -
非递归算法求二叉树的高度
Question:假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度。Analysis:1.用层次遍历来获得二叉树的高度;2.对二叉树进行层次遍历,需要借助队列;3.每次遍历到该层的最右边的结点时,level+1;4.该算法的关键时,如何知道当前的结点是不是该层最后一个结点(last ==rear);Code://二叉链表的结构typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rch原创 2020-09-03 17:24:56 · 2972 阅读 · 3 评论 -
用标志域tag判断队空队满的入队和出队算法
题目:若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时队列状态是空还是满。试编写与此结构相对应的入队和出队算法。front ==rear && tag ==0,队空;front ==rear && tag ==1,队满;初始化:#define MaxSize 50;typedef struct{ ElemType data[MaxSize]; int front原创 2020-08-04 17:21:10 · 1774 阅读 · 2 评论 -
利用栈判断链表的结点值是否中心对称
题目:设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx,xyyx都是中心对称。分析:链表中心对程,即第一个元素的data和最后一个元素的data相等;第二个元素的data和倒数第二个元素的data相等;以此类推;该题已知链表的长度和头指针,可以先用栈存储前半部分的结点(0~i,i=n/2);然后遍历链表的后半部分,将i+1的元素值拿出来与栈顶元素值相比较;如果相同,就弹出栈顶元素,链表指针后移,准备原创 2020-07-30 17:27:28 · 1414 阅读 · 0 评论 -
栈的基本操作
1.初始化栈:void InitStack(SqStack &s){ s.top = -1; //栈顶指针;}2.判断栈是否为空:bool StackEmpty(SqStack s){ if(s.top == -1){//栈为空 return true; }else{ return false; }}3.进栈操作:bool Push(SqStack &s,ElemType x){ if(s.top原创 2020-07-30 10:26:05 · 253 阅读 · 0 评论 -
链表中绝对值相等的节点,仅保留第一次出现的节点而删除其余绝对值相等的节点
题目:用单链表保存m个整数,节点的结构为【data,link】,且|data|<n(n为正整数)。现要求设计一个时间复杂度尽可能高效地算法,对于链表中绝对值相等的节点,仅保留第一次出现的节点而删除其余绝对值相等的节点。例如,若给定的单链表head如下 :则删除节点后的head为:要求:(1) 给出算法的基本思想(2) 使用c或c++语言,给出单链表节点的数据类型定义。(3) 根据设计思想,采用c或c++语言描述算法,关键之处给出注释。(4) 说明所涉及算法的时间复杂度和空间复杂度。原创 2020-07-29 17:21:59 · 2127 阅读 · 1 评论 -
找出由str1和str2所指向两个链表共同后缀的起始位置
题目(2012统考真题):假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间,例如,“loading”和"being"的存储映像如下图所示:设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为(data,next),请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置(如图中字符i所在结点的位置p)。要求:(1)给出算法的基本设计思想。(2)根据设计思想,采用C或C++或java语言描述算法关键之处给出注释。原创 2020-07-29 16:23:49 · 1056 阅读 · 3 评论 -
查找单链表中倒数第k个位置上的结点
题目(2009统考真题):已知一个带有表头结点的单链表,结点结构为假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。要求:(1) 描述算法的基本设计思想(2) 描述算法的详细实现步骤(3) 根据设计思想和实现步骤,采用程序设计语言描述算法(使用C或C++或JAVA语言实现),关键之处请给出简要注释。基本设计思想 :定义两个指针变量p和q;初始时原创 2020-07-27 16:45:29 · 2034 阅读 · 1 评论 -
删除循环单链表中的结点,且输出值从小到大
题目:设有一个带头结点的循环单链表,其结点值均为正整数。设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表头结点。分析:遍历整个链表,将每个点的值与最小值进行对比;初始时,假设第一个结点的值为最小值min;用pre指针记录:指向最小值结点的指针;CODE:void del_min(LinkList &L){ while(L->next != L){ //链表不为空; LNode *p = L->原创 2020-07-27 15:59:02 · 322 阅读 · 0 评论 -
将循环单链表h2链接到循环单链表h1之后
题目:有两个循环单链表,链表头指针分别为h1和h2,编写一函数,将链表h2链接到链表h1之后,要求链接后的链表仍保持循环链表的形式。分析:把链表h1的尾指针,改为指向h2即可;将h2的尾指针指向h1的第一个结点;LinkList Link(LinkList &h1,LinkList &h2){//假设两个链表都带有头结点; if(h2->next == h2) return; //链表h2为空表,不需要链接; //查找尾指针; r1 = Sear原创 2020-07-24 17:14:03 · 466 阅读 · 0 评论 -
判断带头结点的循环双链表是否对称
题目:设计一个算法,用于判断带头结点的循环双链表是否对称。分析:循环双链表的特点是:当前结点方便找到前后节点,且尾指针指向第一个结点;判断第一个结点和最后一个结点的值是否相等,如果想到,再判断第二个结点和倒数第二个结点;以此类推;从前往后遍历,采用p指针,从后往前遍历,采用q指针;如果存在不相等的,退出判断;链表表长为奇数时,如果指针p和q指向同一个结点,则退出循环,说明链表是对称的;链表表长为偶数是,如果指针p和q相邻,则比完p->data和q->data后即可退出;bo原创 2020-07-24 16:21:56 · 4489 阅读 · 1 评论 -
判断序列B是否是序列A的连续子序列
题目:两个整数序列,A=a1,a2,a3,…,am和B=b1,b2,b3,…,bn已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的连续子序列。分析:如果B是A的连续子序列,则在A中能找到一小段,与B一一对应;A表的长度m肯定是大于等于B表的长度;拿B中的第一个元素出来与A中的元素一一比较,如果找到相同的元素,则要判断接下来的元素是不是与B中一一对应;上述步骤中,只要有一个不符合,则需要重新在A接下来的结点中,找到与B的第一个元素相同的结点;然后重复第三和第四步骤,知道A中的元素全原创 2020-07-24 11:36:49 · 2103 阅读 · 1 评论 -
求链表A和B的交集,并存放于A链表中
题目:已知,两个链表A和B分别表示两个集合,其元素递增排列。编制函数,求A与B的交集,并存放于A链表中。分析:求交集,即要找出A中和B中都有的元素;元素递增排列,则可同时遍历;用p指针指向A中当前的结点;用q指针指向B中当前的结点;如果A的data比B的小,则释放当前节点,且A的指针往右移动一位;然后继续比较;如果B的data比B的小,则释放当前节点,B的指针往右移动一位;然后继续比较;如果data相同,则A中保留结点,而B中继续删除该结点;且指针同时右移一位;如果A表比较短,只要确保A中的原创 2020-07-24 10:33:17 · 3132 阅读 · 1 评论 -
设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法,从A和B中的公共元素产生单链表C,要求不破坏A、B的结点。
A、B两个链表的元素均递增有序,所以可以,按顺序,同时从A中和B中各取出一个结点的值来对比;如果A中结点的值比较小,则A中的指针右移;如果B中结点的值比较小,则B中的指针右移;如果相等,则将结点值取出,赋与S结点;并将S结点插入C链表中;然后A、B中的指针各右移;LinkList Get_Common(LinkList A,LinkList B,LinkList &C){ C->next =NULL; //确认c为空链表; LNode *r; r = C;.原创 2020-07-23 17:52:49 · 5373 阅读 · 2 评论 -
在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。
在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。例如(7,10,10,21,30,42,42,42,51,70)将变为(7,10,21,30,42,51,70)。分析:递增有序的线性表中,数值相同的元素,其位置肯定相邻;思路一:先将线性表中的元素依次存储到链表中;然后遍历链表,前后结点的值如果一致,就删除后一个结点;思路二:在线性表中,删除完重复的元素后,将线性表中,剩下的元素依次存储到链表中;//采用思路一void原创 2020-07-23 11:01:49 · 5139 阅读 · 0 评论 -
线性表
1.线性结构的特点?非空时,存在唯一的一个被称为“第一个”的数据元素;非空时,存在唯一的一个被称为“最后一个”的数据元素;非空时,除第一个外,集合中的每个数据元素均只有一个前驱;非空时,除最后一个外,集合中的每个数据元素均只有一个后继。2.什么是线性表?n个数据元素的有限序列;最常用且最简单的一种数据结构;3.线性表的特点是什么?非空表中,每个数据元素都有一个确定的位置...原创 2020-01-01 19:48:07 · 154 阅读 · 0 评论 -
算法
1.什么是算法?对特定问题求解步骤的一种描述。是指令的有限序列。2.算法的基本特性?有穷性(合理的,可接受的)确定性(每条指令都有确切的含义,读者理解时不会产生二义性)可行性(可行的,可以执行有限次来实现)输入(零个或多个输入)输出(一个或多个输入)3.算法的评价标准(算法的目标)?正确性可读性健壮性(当输入数据非法时,算法能适当地作出反应或者处理,而不会产生莫名...原创 2020-01-01 16:05:42 · 154 阅读 · 0 评论