ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:44.51KB ,
资源ID:7744645      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7744645.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构复习提要.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构复习提要.docx

1、数据结构复习提要算法题(26)简答题(40)综合题(24)论述题(10)结论(10)*线性表(10)*栈队列(18)*串(4)*数组(4)*树与二叉树(17)*图(6)*查找(16)*排序(15)*注:算法题: 程序填空;添加注释;写运行结果;画图;描述算法思想。综合题: 画图;根据图表回答问题。数据结构考试重点(答案仅供参考)绪论1 谈谈你对“数据结构”概念的理解。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,在任何问题中,数据元素都不是孤立存在的。而是他们之间存在着某种关系,这种数据元素相互之间的关系称为结构,这也是我们要讨论的数据结构的主要内容。一般来说,数据结构包括以下三方

2、面的内容:(1)数据元素之间的逻辑关系,也称数据的逻辑结构。数据的逻辑结构是抽象的,它不依赖计算机的实现,只依赖人们对事物的理解和描述。(2)数据元素及其关系,在计算机内部(内存)中的表示,称其为数据的物理结构或数据的存储结构。(3)数据的运算及实现,即对数据元素可以施加的操作及这些操作在相应的存储结构上的具体实现。2 谈谈你对“抽象数据类型(ADT)”的理解。抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。抽象数据类型是与表示无关的数据类型,是一个数据模

3、型及定义在该模型上的一组运算。对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。 线性表3 顺序表的动态内存分配的好处是什么?(1)长度能动态增长;根据实际需要分配所需内存大小,合理利用资源(2)不需要预先分配存储空间;(3)存储效率高,紧凑结构;4 单链表中引入“头结点”的好处是什么? 什么情况下单链表需要使用“尾指针”?(1)由于开始结点的位置存放在头结点的指针域中,所以对链表第一个位置的操作同其他位置一样,无须特殊处理。(2) 只

4、有“头指针”时,访问“头”方便,而访问“尾”不方便。有时候,根据需要,一个单向循环链表只设置尾指针,而不设置头指针。此时访问“头”和“尾”都很方便。5 在主调函数中构建了一个“不带头结点”的单链表L1(即该链表已完成初始化,甚至链表已不空),在子函数中对该单链表进行 插入/删除 操作。说明 在参数传递时,使用“引用”与不使用“引用”的区别。6 在主调函数中 声明了 一个单链表L1,在子函数 InitLink( )中对该单链表 初始化 为一个“带头结点”的单链表。在 “不使用引用型参数”的情况下,1) 写出初始化函数。 typedef int data;typedef struct LNode

5、data d; Struct LNode *next;LNode ,*LinkList;LinkList initialize (void) LinkList L; L=(LinkList)malloc (sizeof(LNode);L-next=NULL;return L;2)写出调用该函数的语句。Void main () LinkList L1; L1=initialize(); . . . return 0;栈队列7 对“链栈”, 哪一端是“栈顶”?为什么?链头作为栈顶原因:链栈是运算受限的单链表,其插入和删除操作仅限制在表头位置上操作,因此将链头作为栈顶方便操作。8 链栈中还要不要“头

6、结点”?为什么?不要。原因:链栈是运算受限的单链表,其插入和删除的操作仅在链表头位置上进行。如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂。9 顺序栈采用动态内存分配,数据结构定义如下:typedef struct sStack DataType *base; DataType *top; int stacksize; /最大容量 SqStack;1)如何求栈高? Int stackHeight (SqStack sq) return sq.top-sq.base;2)能否将 top 定义成 int 类型?可以10 链队列的“队头”与其它链式结构(如 链栈 或者 单链表)有

7、什么不同?11 为什么引入“循环队列”? 写出循环队列 判队满,判队空 以及 求队长的表达式。原因:为充分利用向量空间,克服假溢出现象方法:1)设置一个队长变量2)牺牲一个元素空间 队空:Q.front= Q.rear; 队满:(Q.rear+1)%maxsize= Q.front队长(Q.rear-Q.front+MAXSIZE)%MAXSIZE知识:12.对于一般的顺序存储结构,若采用“动态内存分配”,当插入元素而空间不足时,可以动态增加内存分配。而对于循环队列,能否这样做?为什么?不能(1)循环队列是将顺序队列臆造成一个环状空间,当插入元素而空间不足时,动态增长内存分配会破坏循环队列的结

8、构。(2)循环队列队满的标志为(Q.rear+1)%maxsize=Q.front。要插入元素,只能让对头元素出队。能力:13.定义一个长度为k的循环队列,有一个字符串 S(长度k ),编写程序完成 进队出队。调试完毕后,将完整代码写在实验报告册上。特别强调:将关键代码加注释,注释行数不少于总代码行的 2/3 。#include stdio.h#include stdlib.h#define MAXSIZE 10; /最大队列长度typedef char DataType;typedef struct DataType *base; /初始化的动态分配存储空间int front ,rear;

9、/头,尾指针,若队列不空,指队头元素、队列尾元素的下一个位置 SqQueue;/-实现-void InitQueue (SqQueue &Q) /初始化队列 Q.base=(DataType *)malloc( MAXSIZE* sizeof( DataType) ); Q.front=Q.rear=0;bool isQEmpty( SqQueue Q) /判队空 if (Q.front=Q.rear) return true; else return false;bool isQFull( SqQueue Q) /判队满 if (Q.rear+1) % MAXSIZE =Q.front) r

10、eturn true; else return false;void EnQueue(SqQueue &Q, DataType &e) /向队列中添加元素 Q.baseQ.rear=e; Q.rear=(Q.rear+1)% MAXSIZE;void OutQueue(SqQueue &Q, DataType &e) /出队 e=Q.baseQ.front; Q.front=(Q.front+1)% MAXSIZE;/-实现完毕-void main() /调用函数 SqQueue Q1; InitQueue (Q1); char c1, c2; cout请读入符号串,以 # 号结束:c1; w

11、hile( c1!=#) if( ! isQFull(Q1) ) EnQueue(Q1, c1); cinc1; else OutQueue(Q1,c2); coutc2; while( ! isQEmpty(Q1) ) OutQueue(Q1,c2); coutc2; coutendl;*/串14.能力:在第1章 绪论中,曾经写了一个描述“串”的ADT,并给出了其表示与实现,以及一个完整的程序。要求:给该程序关键代码加注释,注释行数不少于总代码行的 2/3 。#include iostream.h#include malloc.htypedef struct str char *ch; in

12、t length;HString;/-基本操作算法描述-bool StrAssign(HString &T, char *chars) /将chars串赋给T int i; char *c; if( T.ch) free( T.ch); /这行代码有问题,思考? for( i=0, c=chars; *c ; i+, c+) /求chars串的长度 ; if( !i) T.ch=NULL; T.length=0; /建立一个空串 else T.ch=( char *) malloc( i* sizeof( char) );/注意:这里没有检测是否内存分配成功,其实是应该做的 for( int

13、j=0; ji; j+) T.chj=charsj; /注意:T串的末尾没有添加0 T.length=i; return true; /赋值成功 int StrLength( HString S) /求串长 return S.length;int StrCompare( HString S, HString T) /串大小的比较 int i; for( i=0; iS.length & iT.length; i+) if( S.chi != T.chi ) return S.chi - T.chi; return S.length - T.length; /请理解这一行的意思 bool Sub

14、String(HString &Sub, HString S, int pos, int len) /求子串 if( posS.length | lenS.length-pos+1) return false; if( Sub.ch) free(Sub.ch); /这行代码有问题,思考? if( !len) Sub.ch=NULL; Sub.length=0; else Sub.ch=( char*) malloc( len * sizeof( char) );/注意:这里没有检测是否内存分配成功,其实是应该做的 for( int j=0, k=pos-1; j0) n=StrLength(S

15、); m=StrLength(T); i=pos; while( ipos; coutIndex( S, T, pos)endl; 数组知识:15.二维数组A89按行优先顺序存储,若数组元素A23的存储地址为1087,A47的存储地址为1153,则数组元素A67的存储地址是多少?A47和A23相差22个元素(49+7)-(29+3)=221153-1087=66 即一个数组元素占3个字节A67和A47相差18个元素 (69+7)-(49+7)=18则A67存储地址为1153+183=120716、三角矩阵和对称矩阵在进行压缩存储时有什么不同?三角矩阵是指上(下)三角矩阵的下(上)三角(不包括对

16、角线)中的元素均为常数C或0,所以在压缩存储时只存储上(下)三角中的元素,并加一个存储常数C的存储空间。对称矩阵进行压缩存储时是每一对称无分配一个存储空间,将n的平方个元压缩存储在n(n+1)/2个元的空间中。树和二叉树:知识:17、对于二叉树,什么情况下选用“顺序存储”较好?稠密的树18、先序序列为:ABCDEFG,中序序列为:CBAEFGD,画出该二叉树,及二叉链表。19、实现二叉链表的层序遍历,需要借助于什么数据结构?为什么?层序遍历需要借助于“队列”完成,对二叉树遍历,除了按 先序、中序、后序遍历外,还可以按“层序”遍历。先一层的遍历完须保存下来。20、结点权值分别是:0.05,0.2

17、9,0.07,0.08,0.14,0.23,0.03, 0.11,构造最优二叉树。例如:1,2,3,4,5,6,7,8,9,101、先在序列里找权值两个最小的根结点。选1,2组成一棵二叉数。然后,把1,2去掉。用根结点的权值3加入原序列。3,3,4,5,6,7,8,9,102、在新的序列中找权值两个最小的根结点.选3,3组成一棵二叉数。然后,把3.3去掉。用根结点的权值6加入原序列,升序排列。4,5,6,6,7,8,9,103、在新的序列中找权值两个最小的根结点.选4,5组成一棵二叉数。然后,把4,5去掉。用根结点的权值9加入原序列。升序排列。6,6,7,8,9,9,104、在新的序列中找权值

18、两个最小的根结点.选6,6组成一棵二叉数。然后,把6,6去掉。用根结点的权值12加入原序列。升序排列。7,8,9,9,10,125、在新的序列中找权值两个最小的根结点.选7,8组成一棵二叉数。然后,把7,8去掉。用根结点的权值15加入原序列。升序排列。9,9,10,12,156、在新的序列中找权值两个最小的根结点.选9,9组成一棵二叉数。然后,把9,9去掉。用根结点的权值18加入原序列。升序排列。10,12,15,187、在新的序列中找权值两个最小的根结点.选10,12组成一棵二叉数。然后,把10,12去掉。用根结点的权值22加入原序列。升序排列。15,18,228、在新的序列中找权值两个最小

19、的根结点.选15,18组成一棵二叉数。然后,把15,18去掉。用根结点的权值33加入原序列。升序排列。22,339、在新的序列中找权值两个最小的根结点.选22,33组成一棵二叉数。然后,把22,33去掉。用根结点的权值55加入原序列。5521、能力:1)按右图所示的二叉树建立二叉链表,然后:2)按“中序”遍历二叉链表;3)求树高度;调试完毕后,将完整代码写在实验报告册上。要求:将关键代码加注释,注释行数不少于总代码行的 2/3 。#include #include typedef char elemtype;typedef struct BiNTree /*定义二叉树结点类型*/ elemty

20、pe data; struct BiNTree *lchild; struct BiNTree *rchild;BiNTree,*BiTree; /创建一棵二叉树void CreateBiTree(BiTree &T) if( T) free(T); cinch; if (ch=#) T= NULL; else T=(BiTNode*)malloc(sizeof(BiTNode); T-data = ch; CreateBiTree(T-lchild); CreateBiTree(T-rchild); /递归创建一棵二叉树 return OK;void InOrderTraverse(BiTr

21、ee T) 中序遍历 if (T) InOrderTraverse(T-lchild); 访问左子树 printf(%c,T-data); InOrderTraverse(T-rchild); 访问右子树 int Depth(BiTree T) 求树高 int depl, depr; 左右子树的高度 if (T) depl=Depth(T-lchild); depr=Depth(T-rchild); if (depl=depr) return (depl+1); else return (depr+1); 返回子树高度加上根节点高度 return 0;int main(void) 调用函数 B

22、iTree t; /*定义二叉数*/ CreateBiTree(t); printf(n中序输出); InOrder(t); 访问二叉树 Depth(t); return 0;22、带“空指针域标记”的中序序列能否确定二叉树的形态?为什么?不能图23、(1)画出图(a)的邻接表,并说明如何根据其邻接表求结点V1的入度和出度。P164页第一个图 在有向图的邻接表中,第 i 个链表中结点的个数是顶点Vi的出度。此邻接表中V1邻接的节点为两个,则V1的出度为2 但是要求Vi的入度较困难,需遍历整张表。此邻接表中只有顶点V4的单链表中有V1,则V1的入度为1(2)写出从V1开始的深度优先遍历序列。例:

23、V1V3V4V2(答案不唯一)方法:(1)从图中的某个顶点V出发,访问之;(2)依次从顶点V的未被访问过的邻接点出发,深度优先遍历图,直到图中所有和顶点V 有路径相通的顶点都被访问到;(3)若此时图中尚有顶点未被访问到,则另选一个未被访问过的顶点作起始点,重复上述(1) (2)的操作,直到图中所有的顶点都被访问到为止。(基本思路(假定从A出发) 先访问A点,再访问A的第1个尚未访问的邻接点B;再访问B的第1个尚未访问的邻接点C;再访问C的第1个尚未访问的邻接点D;。到头后沿原路返回,再访问返回路径上其他点的第1个尚未访问的邻接点,直至所有顶点访问完毕。)(3)画出图(b)的邻接矩阵,并说明如何

24、根据其邻接矩阵求结点V1的度。 V1 V2 V3 V4 V5 V1 0 1 0 1 0V2 1 0 1 0 1V3 0 1 0 1 1V4 1 0 1 0 0V5 0 1 1 0 0(4)写出从V2开始的广度优先遍历序列。例:V2-V1-V3-V5-V4(答案不唯一)方法:(1)从图中的某个顶点V出发,访问之;(2)依次访问顶点V的各个未被访问过的邻接点,将V的全部邻接点都访问到;(3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问过的顶点的邻接点都被访问到。广度优先搜索不是一个递归的过程,它需要

25、借助于队列完成(基本思路图的广度优先遍历的思路是:尽可能先对横向进行遍历,先访问的节点其邻接点也最先被访问。)查找24、集合元素的关键字依次为:1,2,3,4,6,8,20,25,26,27,40,50。(1)画出二分查找的判定树;某个结点所在的层数,就是查找该结点需要比较的次数(节点的值不是关键字的值,而是关键字在表中的位置)我们对一维数组中存放的元素 15 23 38 47 55 62 88 95 102 123 这十个数用二分法查找元素 95 要用到二叉树构建的方法. 如果查找数组元素个数是偶数n=10,那就将(n+1)/2=5.5,这里有向上取整和向下取整两种方法,我用向下取整这种方法

26、解释下。5.5向下取整就是5,所以数组的第五个元素 55 作为二叉树的根节点.这时数组分为了两堆.15 23 38 47和62 88 95 102 123.还是同样的方法15 23 38 47 这一堆的中间元素是(4+1)/2=2.5向下取整就是元素23,而62 88 95 102 123这一堆本来就是奇数,所以直接将95作为他们的中间元素,此时的左边一堆的中间元素 23 和右边一堆的中间元素 95分别作为刚刚原数组中间元素55这个根节点的左子树和右子树。然后又将元素分成了 15(以23作为中间元素的左边一堆)和38 47(以23作为中间元素的右边一堆) 和62 88(以95作为中间元素的左边

27、一堆) 和102 123(以95作为中间元素的右边一堆)这四堆。分别取四堆的中间元素,15 、38、62、102.其中15和38分别作为节点23的左、右子树,而62和102作为节点95的左、右子树。然后就该是八堆了.但是15只有一个元素所以他就只是叶子节点了,38 47取走38后只剩47所以47作为节点38的子树寄叶子节点,右边62 88取走62后剩88作为62的叶子节点,102 123取走102后只有123作为他的叶子节点。现在要查找95这个元素.第一次访问根节点55,然后第二就可以访问根节点的右子树95节点了.所以只要两次就可以了. (2)每个结点查找等概率情况下,求平均查找长度。 ASL=P1C1+P2C2+P3C3+ . +PnCn Pi与Ci分别表示第i个数被

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1