数据结构自测题答案.docx
《数据结构自测题答案.docx》由会员分享,可在线阅读,更多相关《数据结构自测题答案.docx(33页珍藏版)》请在三一办公上搜索。
1、第1章绪论一、选择题12345678CCADABCC二、填空题1. 4种基本结构是:集合、线性结构、树形结构、图状结构。2. 树形结构中元素的关系是一对多,图形结构中元素的关系是多对多。3. 顺序存储结构中数据元素的存储位置与其逻辑顺序是对应的。4. 算法效率的度量方法有:事后统计方法和事前分析估算方法。5. 好算法应达到的目标:正确性、可读性、健壮性、执行时间短、存储量低。6. 抽象数据类型可细分为3种:原子类型、固定聚合类型和可变聚合类型。7. 抽象数据类型的定义包括:数据对象的定义、数据关系的定义、基本操作的定义。三、判断题1234567891011VXVXVVXXXVX五、应用题1.
2、按增长率从小到大的顺序排列下列各函数:(2/3)n,log2n,n,n2, n!2. 写出以下各函数的功能,并求出其时间复杂度。 功能是判断n是否为素数,时间复杂度为O(n )。 功能是计算1!+2!+.+n!,时间复杂度为O(n )。 功能是计算1!+2!+.+n!,时间复杂度为O(n2 )。六、算法题1. 编写算法计算1!+2!+.+n!,并使算法的时间复杂度为O(n)。算法思想:用循环实现阶乘的累加求和,注意在求n!时,使用前一次循环中已经求出的(n-1)!的结果。double factorial(int n) int i;double p=1, sum=0;for( i=1; iMAX
3、INT (OWkWn)时,应进行出错处理。算法思想:先判断n的取值是否合法,若非法则直接退出程序,若n合法则继续计算2i, 在计算2i时,需要判断2i的值是否大于MAXINT/2,这个条件其实就是判断2i+i的值是否大于MAXINT#define arrsize 100#define MAXINT 65535 void calculate(int a , int n) int i;if(narrsize) printf(n error!n);exit(-1); a0=1;printf(a0=%dn, a0);for(i=1; iMAXINT/2 )( printf(i=%d, ERROR!n”
4、,i+1); break;第2章线性结构一、选择题1234567891011121314151617ABCADBBACACBBBDCD二、填空题1. 需向后移动p-i+1 个兀素。2. 应采用顺序存储结构。3. 有/个结点的单链表,在x的结点后插入一个新结点的时间复杂度为O(n) 。4. 可以将线性链表分成 单链表 和多重链表。5. 链接存储的特点是利用_指针来表示数据元素之间的逻辑关系。6. 顺序存储结构是通过 物理位置相邻一 表示元素之间的关系的;链式存储结构是通过 指针表示元素之间的关系的。7. 循环单链表的最大优点是:_从任一结点出发都可访问到链表中每一个元素。8. 带头结点的单循环链
5、表L, L为空表的条件是:_L-next=二L 。三、判断题12345678XXXXXXXV四、简答题1. 对线性表中的插入操作,分别写出顺序存储结构和链式存储结构下的时间复杂度。答:O(n), 0(1)2. 线性结构的特点是什么?答:在数据元素的非空有限集中,(1)存在唯一的一个被称为“第一个”的数据元素;(2)存 在唯一的一个被称为“最后一个”的数据元素;(3)除第一个之外,集合中的每个元素均只 有一个前驱;(4)除最后一个之外,集合中每个元素均只有一个后继3. 说明在线性表的链式存储结构中,头指针与头结点之间的根本区别;头结点与首元结 点的关系。答:在线性表的链式存储结构中,头指针指链表
6、的指针,若链表有头结点则是链表的头结 点的指针,头指针具有标识作用,故常用头指针冠以链表的名字。头结点是为了操作的统 一、方便而设立的,放在第一元素结点之前,其数据域一般无意义(有些情况下也可存放 链表的长度、用做监视哨等),有头结点后,对在第一元素结点前插入结点和删除第一结 点,其操作与对其它结点的操作统一了。而且无论链表是否为空,头指针均不为空。首元 结点也就是第一元素结点,它是头结点后边的第一个结点。4. 在单链表和双向链表中,能否从当前结点出发访问到任何一个结点?答:在单链表中不能从当前结点(若当前结点不是第一结点)出发访问到任何一个结点, 链表只能从头指针开始,访问到链表中每个结点。
7、在双链表中求前驱和后继都容易,从当 前结点向前到第一结点,向后到最后结点,可以访问到任何一个结点。*5.顺序表在插入或删除元素时一般需要移动元素,如果想不移动多个元素就实现插入和 删除,应该如何处理?答:插入元素时,直接将新元素插在第n+1个位置;删除第i个元素时,将第n个元素补 到第i个位置。五、算法题1、利用线性表的基本操作(教材P19),实现在线性表A中删除在线性表B中出现的元素。#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct int *elem;int length;int listsize;SqList
8、;void Delete(SqList &A, SqList B)线性表 A、B 已存在 B_len=ListLength(B);for(i=1; i=B_len; i+) GetElem(B, i, e);/用e返回B中第i个元素的值n= LocateElem(A, e, equal); / n 为 e 在 A 中的位序 if ( n!=0) ListDelete(A, n, e );删除 A 中第 n 个元素2、编写算法,将一个有n个非零元素的线性表A拆分成两个线性表,其中大于零的元素 存放线性表B中,小于零的元素存放在线性表C中。#define LIST_INIT_SIZE 100#de
9、fine LISTINCREMENT 10typedef struct int *elem;int length;int listsize;SqList;void separate(SqList A, SqList &B, SqList &C) 线性表 A 已存在,B 和 C 不存在 InitList(B);InitList(C);na=A.length;nb=nc=0;for(i=0; i0 ) B.elemnb=A.elemi; nb+; else C.elemnc=A.elemi; nc+; B.length=nb; C.length=nc;3、分别基于线性表的顺序存储结构和链式存储结构
10、(带头结点),实现以下操作:从线性表中删除具有给定值x的所有元素。(2) 从线性表中删除其值在有给定值s与t之间的所有元素,其中要求s=t,若s或t不 合理,或线性表为空,则显示出错信息并退出程序。(3) 假设线性表的元素按递增顺序排列,删除表中所有大于s且小于t的所有元素(若存 在这样的元素),要求s0; i-)从后面开始删除,可以减少元素的移动次数if (L.elemi-1 = x ) for( int j=i; jt ) printf( ”s, t 的值不合理!n”); return ; for( int i=L.length; i0; i-)从后面开始删除if (L.elemi-1 =
11、 s & L.elemi-1=t ) for( int j=i; jt ) printf( ”s, t 的值不合理!n”); return; for( int i=0; iL.length & L.elemis; i+) 寻找值大于等于 s 的第 1 个元素;注意循环体为空语句if ( i=L.length )( printf(”线性表中所有元素值都小于s!n”); return ; for( int j=i; jL.length & L.elemj=t; j+); 寻找值大于 t 的第 1 个元素for( int n=i, k=j; kL.length; n+, k+)L.elemn=L.e
12、lemk;L.length=L.length-(j-i);(4) void Delete_same(SqList &L) /L 为有序表 if( L.length=0) printf(线性表为空!n); return; for( int i=0; iL.length; i+) while( iL.length-1 & L.elemi!=L.elemi+1)i+;寻找重复元素if(i=L.length-1) break;for( int j=i+1; L.elemj=L.elemi; j+); /寻找与第 i 个元素不相同的元素for( int t=i+1, k=j; knext; q=L;wh
13、ile (p!=NULL ) if(p-data!=x) q=p; p=p-next; else q-next = p-next; free(p); p=q-next; (2)void ListDelete_st(LinkList &L, int s, int t) 删除值在 st 之间的元素 LinkList p,q;if(L=NULL) printf(链表为空! n); return; p = L-next;q=L;while (p!=NULL ) if (p-data=s & p-datanext = p-next; free(p); p=q-next; else q=p; p=p-ne
14、xt; void Delete_st(LinkList &L, int s, int t) /在有序单链表L中,删除值在st之间的结点 LinkList p, q, p1, p2;if(L=NULL) printf(链表为空! n); return ; p = L-next;while(p!=NULL & p-datanext; / p指向该元素,q指向p的前驱结点if(p=NULL) printf(链表中所有元素值都小于s!n); return ; while(p!=NULL & p-datanext;p1=q-next;q-next = p; 删除值在st之间的所有结点while(p1!=
15、p)循环释放st之间的所有结点的空间p2=p1; p1=p1-next; free(p2); (4) void Delete_same(LinkList &L) /在有序单链表L中,删除值相同的多余结点 LinkList p,q;if(L=NULL) printf(链表为空! n); return ; p = L-next;while(p!=NULL & p-next!=NULL) q=p-next;if(p-data!=q-data) p=p-next;else p-next=q-next;free(q);p=p-next;*4、设有一个不带头结点的非空单链表,编写递归算法实现以下操作:(1
16、) 求链表中的结点个数(2) 求链表中的最大整数(设链表结点的数据域中存放的是整型数据)typedef struct LNode int data;Struct LNode *next;Lnode, *LinkList;(1) int Num(LinkList L) / 链表 L 已存在 if( L-next=NULL ) return 1;elsereturn (1+Num( L-next);void Max(LinkList L,int &m)/链表L已存在,找到的最大整数存在m中 int n;if( L-next=NULL ) m=L-data;else Max( L-next, n);
17、m= L-datan?L-data:n;第3章栈和队列一、选择题1234567891011BCBBADCADDC二、填空题1. 栈和队列都是 线性 结构,对于栈只能在栈顶插入和删除元素;对于队列只能在队尾 插入和 队首删除元素。2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。不允许插入和删除运算的一端称为栈底 。3. 在具有n个单元的循环队列中,队满时共有n-1个元素。4. 向栈中插入元素的操作是先存入元素,后移动栈顶指针。5. 带表头结点的空循环链表的长度等于0。6. 设循环队列Qmaxsize的队头指针为front,队尾指针为rear,则该队列的队满条件是 Q.front=(
18、Q.rear+1)%maxsize 。三、判断题1234567891011VXXVVXXVXXV四、简答题1. 说明线性表、栈与队的异同点。答:相同点:都是线性结构,都是逻辑结构的概念。都可以用顺序存储或链表存储;栈和 队列是两种特殊的线性表,即受限的线性表,只是对插入、删除运算加以限制。不同点: 运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入、删除运算,因而是 后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。 用途不同,堆栈用于子程调用和保护现场,队列用于多道作业处理、指令寄存及其他运算等等。2. 设有编号为1,2, 3, 4的四辆列
19、车,顺序进入一个栈式结构的车站,具体写出这四辆 列车开出车站的所有可能的顺序。答:至少有14种。 全进之后再出情况,只有1种:4, 3, 2,1 进3个之后再出的情况,有3种,3,4,2,1 3,2,4,1 3,2,1,4 进 2 个之后再出的情况,有 5 种,2,4,3,12,3,4,12,1, 3,4 2,1,4,3 2,1,3,4 进 1 个之后再出的情况,有 5 种,1,4,3,2 1,3,2,4 1,3,4,2 1, 2,3,4 1,2,4,33. 假设正读和反读都相同的字符序列为“回文”,例如,abba和abcba是回文,abcde 和 ababab 则不是回文。假设一字符序列已存
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 自测 答案
链接地址:https://www.31ppt.com/p-5306687.html