南京晓庄学院数据结构题库参考答案.docx
- 文档编号:3826661
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:29
- 大小:538.15KB
南京晓庄学院数据结构题库参考答案.docx
《南京晓庄学院数据结构题库参考答案.docx》由会员分享,可在线阅读,更多相关《南京晓庄学院数据结构题库参考答案.docx(29页珍藏版)》请在冰豆网上搜索。
南京晓庄学院数据结构题库参考答案
数据结构与算法
习题册
(课后部分参考答案)
《数据结构与算法》课程组
目录
课后习题部分
第一章绪论1
第二章线性表3
第三章栈和队列5
第四章串8
第五章数组和广义表10
第六章树和二叉树13
第七章图16
第九章查找20
第十章排序23
第一章绪论
一.填空题
1.从逻辑关系上讲,数据结构的类型主要分为集合、线性结构、树结构和图结构。
2.数据的存储结构主要有顺序存储和链式存储两种基本方法,不论哪种存储结构,都要存储两方面的内容:
数据元素和数据元素之间的关系。
3.算法具有五个特性,分别是有穷性、确定性、可行性、输入、输出。
4.算法设计要求中的健壮性指的是算法在发生非法操作时可以作出处理的特性。
二.选择题
1.顺序存储结构中数据元素之间的逻辑关系是由C表示的,链接存储结构中的数据元素之间的逻辑关系是由D表示的。
A线性结构B非线性结构C存储位置D指针
2.假设有如下遗产继承规则:
丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。
则表示该遗产继承关系的最合适的数据结构应该是B。
A树B图C线性表D集合
3.算法指的是A。
A对特定问题求解步骤的一种描述,是指令的有限序列。
B计算机程序C解决问题的计算方法D数据处理
三.简答题
1.分析以下各程序段,并用大O记号表示其执行时间。
(1)
(2)
i=1;k=0;i=1;k=0;
While(i {{ k=k+10*i;k=k+10*i; i++;i++; }}while(i<=n) ⑴基本语句是k=k+10*i,共执行了n-2次,所以T(n)=O(n)。 ⑵基本语句是k=k+10*i,共执行了n次,所以T(n)=O(n)。 2.设有数据结构(D,R),其中D={1,2,3,4,5,6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。 试画出其逻辑结构图并指出属于何种结构。 其逻辑结构图如下所示,它是一种图结构。 3.求多项式A(x)的算法可根据下列两个公式之一来设计: ⑴A(x)=anxn+an-1xn-1+…+a1x+a0 ⑵A(x)=(…(anx+an-1)x+…+a1)x)+a0 根据算法的时间复杂度分析比较这两种算法的优劣。 第二种算法的时间性能要好些。 第一种算法需执行大量的乘法运算,而第二种算法进行了优化,减少了不必要的乘法运算。 第二章线性表 一.填空题 1.在顺序表中,等概率情况下,插入和删除一个元素平均需移动表长的一半个元素,具体移动元素的个数与表长和插入的位置有关。 2.在一个长度为n的顺序表的第i(1≤i≤n+1)个元素之前插入一个元素,需向后移动 n-i+1个元素,删除第i(1≤i≤n)个元素时,需向前移动n-i个元素。 3.在单循环链表中,由rear指向表尾,在表尾插入一个结点s的操作顺序是s->next=rear->next;rear->next=s;rear=s;;删除开始结点的操作顺序为q=rear->next->next;rear->next->next=q->next;deleteq;。 二.选择题 1.数据在计算机存储器内表示时物理地址与逻辑地址相同并且是连续的,称之为: C A存储结构B逻辑结构C顺序存储结构D链式存储结构 2.在n个结点的顺序表中,算法的时间复杂度是O (1)的操作是: A A访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) B在第i个结点后插入一个新结点(1≤i≤n) C删除第i个结点(1≤i≤n)D将n个结点从小到大排序 3.线性表L在B情况下适用于使用链式结构实现。 A需经常修改L中的结点值B需不断对L进行删除插入 CL中含有大量的结点DL中结点结构复杂 4.单链表的存储密度C A大于1B等于1C小于1D不能确定 三.判断题 1.线性表的逻辑顺序和存储顺序总是一致的。 F 2.线性表的顺序存储结构优于链接存储结构。 F 3.设p,q是指针,若p=q,则*p=*q。 F 4.线性结构的基本特征是: 每个元素有且仅有一个直接前驱和一个直接后继。 F 四.简答题 1.分析下列情况下,采用何种存储结构更好些。 (1)若线性表的总长度基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素。 (2)如果n个线性表同时并存,并且在处理过程中各表的长度会动态发生变化。 (3)描述一个城市的设计和规划。 ⑴应选用顺序存储结构。 很少进行插入和删除操作,所以空间变化不大,且需要快速存取,所以应选用顺序存储结构。 ⑵应选用链式存储结构。 链表容易实现表容量的扩充,适合表的长度动态发生变化。 ⑶应选用链式存储结构。 因为一个城市的设计和规划涉及活动很多,需要经常修改、扩充和删除各种信息,才能适应不断发展的需要。 而顺序表的插入、删除的效率低,故不合适。 五.算法设计 1.已知数组A[n]中的元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数,并要求算法的时间复杂度为O(n)。 2.线性表存放在整型数组A[arrsize]的前elenum个单元中,且递增有序。 编写算法,将元素x插入到线性表的适当位置上,以保持线性表的有序性,并且分析算法的时间复杂度。 intinsert(datatypeA[],int*elenum,datatypex) /*设elenum为表的最大下标*/ {if(*elenum==arrsize-1) return0; /*表已满,无法插入*/ else{i=*elenum; while(i>=0&&A[i]>x) /*边找位置边移动*/ {A[i+1]=A[i]; i--; } A[i+1]=x; /*找到的位置是插入位的下一位*/ (*elenum)++; return1; /*插入成功*/ } } O(n) 第三章栈和队列 一.填空题 1.设有一个空栈,栈顶指针为1000H,现有输入序列为1.2.3.4.5,经过push,push,pop,push,pop,push,push后,输出序列是23,栈顶指针为1003H。 2.栈通常采用的两种存储结构是顺序栈、链栈;其判定栈空的条件分别是TOP=-1、TOP=NULL,判定栈满的条件分别是TOP=数组长度、存储空间满。 3.栈可作为实现递归函数调用的一种数据结构。 4.表达式a*(b+c)-d的后缀表达式是abc+*d-。 二.选择题 1.若一个栈的输入序列是1,2,3,…,n,输出序列的第一个元素是n,则第i个输出元素是D。 A不确定Bn-iCn-i-1Dn-i+1 2.设栈S和队列Q的初始状态为空,元素e1.e2.e3.e4.e5.e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的顺序是e2.e4.e3.e6.e5.e1,则栈S的容量至少应该是C。 A6 B4 C3 D2 3.一个栈的入栈序列是1,2,3,4,5,则栈的不可能的输出序列是C。 A54321B45321C43512D12345 三.判断题 1.有n个元素依次进栈,则出栈序列有(n-1)/2种。 F 2.栈可以作为实现过程调用的一种数据结构。 T 3.在栈满的情况下不能做进栈操作,否则将产生“上溢”。 T 4.在循环队列中,front指向队头元素的前一个位置,rear指向队尾元素的位置,则队满的条件是front=rear。 F 四.简答题 1.设有一个栈,元素进栈的次序为A,B,C,D,E,能否得到如下出栈序列,若能,请写出操作序列,若不能,请说明原因。 ⑴C,E,A,B,D ⑵C,B,A,D,E ⑴不能,因为在C、E出栈后,A一定在栈中,而且在B的下面,不可能先于B出栈 ⑵可以,设I为进栈操作,O为入栈操作,则其操作序列为IIIOOOIOIO。 2.在操作序列push (1).push (2).pop.push(5).push(7).pop.push(6)之后,栈顶元素和栈底元素分别是什么? (push(k)表示k入栈,pop表示栈顶元素出栈。 ) 栈顶元素为6,栈底元素为1。 3.在操作序列EnQueue (1).EnQueue(3).DeQueue.EnQueue(5).EnQueue(7).DeQueue.EnQueue(9)之后,队头元素和队尾元素分别是什么? (EnQueue(k)表示整数k入队,DeQueue表示队头元素出队)。 队头元素为5,队尾元素为9。 4.简述以下算法的功能(栈的元素类型SElemType为int)。 (1)statusalgo1(StackS,inte) { StackT;intd;InitStack(T); while(! StackEmpty(S)){ Pop(S,d); if(d! =e)Push(T,d); } while(! StackEmpty(T)){ Pop(T,d);Push(S,d); } }//S中如果存在e,则删除它。 (2)voidalgo2(Queue&Q) { StackS;intd;InitStack(S); while(! QueueEmpty(Q)) { DeQueue(Q,d);Push(S,d); } while(! StackEmpty(S)) { Pop(S,d);EnQueue(Q,d); } }//队列逆置 五.算法设计 1.试写一个判别表达式中开、闭括号是否配对出现的算法 BOOLBracketCorrespondency(chara[]) { inti=0; Stacks; InitStack(s); ElemTypex; while(a[i]){ switch(a[i]){ case'(': Push(s,a[i]); break; case'[': Push(s,a[i]); break; case')': GetTop(s,x); if(x=='(')Pop(s,x); elsereturnFALSE; break; case']': GetTop(s,x); if(x=='[')Pop(s,x); elsereturnFALSE; break; default: break; } i++; } if(s.size! =0)returnFALSE; returnTRUE; } 2.假设称正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’则不是回文。 试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文”。 StatusSymmetryString(char*p) { Queueq; if(! InitQueue(q))return0; Stacks; InitStack(s); ElemTypee1,e2; while(*p){ Push(s,*p); EnQueue(q,*p); p++; } while(! StackEmpty(s)){ Pop(s,e1); DeQueue(q,e2); if(e1! =e2)returnFALSE; } returnOK; } 第四章串 一.填空题 1.不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。 2.设S=“A;/document/Mary.doc”,则strlen(s)=20,“/”的字符定位的位置为3。 3.若n为主串长,m为子串长,则串的经典模式匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m。 二.选择题 1.串是一种特殊的线性表,其特殊性体现在: (B) A可以顺序存储B数据元素是一个字符 C可以链式存储D数据元素可以是多个字符 2.设有两个串p和q,求q在p中首次出现的位置的运算称作: (B) A连接B模式匹配C求子串D求串长 3.设串s1=’ABCDEFG’,s2=’PQRST’,函数con(x,y)返回x和y串的连接串, subs(s,i,j)返回串s的从序号i开始的j个字符组成的子串,len(s)返回串s的长度,则con(subs(s1,2,len(s2)),subs(s1,len(s2),2))的结果串是: (D) A‘BCDEF’B‘BCDEFG’C‘BCPQRST’D‘BCDEFEF’ 4.若串S=”software”,其子串的数目是(B)。 A8B37C36D9 三.计算题 1.设s=’IAMASTUDENT’,t=’GOOD’,q=’WORKER’,求: 1)Replace(s,’STUDENT’,q)2)Concat(t,SubString(s,7,8))) 1、Replace(s,’STUDENT’,q)=’IAMAWORKER’ 2、因为SubString(s,7,8)=‘STUDENT’Concat(t,SubString(s,7,8))=’GOODSTUDENT’ 四.算法设计 1.利用C的库函数strlen,strcpy(或strncpy)写一个算法voidStrDelete(char*S,intt,intm),删除串S中从位置i开始的连续的m个字符。 若i≥strlen(S),则没有字符被删除;若i+m≥strlen(S),则将S中从位置i开始直至末尾的字符均被删去。 提示: strlen是求串长(length)函数: intstrlen(chars);//求串的长度 strcpy是串复制(copy)函数: char*strcpy(charto,charfrom);//该函数将串from复制到串to中,并且返回一个指向串to的开始处的指针。 voidStrDelete(char*S,inti,intm) {//串删除 charTemp[Maxsize];//定义一个临时串 if(i+m { strcpy(Temp,&S[i+m]);//把删除的字符以后的字符保存到临时串中 strcpy(&S[i],Temp);//用临时串中的字符覆盖位置i之后的字符 } elseif(i+m>=strlen(S)&&i { strcpy(&S[i],"\0");//把位置i的元素置为'\0',表示串结束 } } 第五章数组和广义表 一.填空 1.假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。 已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288;末尾元素A57的第一个字节地址为1282;若按行存储时,元素A14的第一个字节地址为1072;若按列存储时,元素A47的第一个字节地址为1276。 2.三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。 。 3.广义表((a),(((b),c)),(d))的长度是3,深度是4,表头是(a),表尾是(((b),c)),(d)。 4.已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是Head(Head(Tail(LS)))。 二.选择题 1.假设有60行70列的二维数组a[1…60,1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为(A)。 (无第0行第0列元素) A16902B16904C14454D答案A,B,C均不对 2.设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B[1,n(n-1)/2]中,下三角部分中任一元素ai,j(i≤j),在一维数组B中下标k的值是: (B) Ai(i-1)/2+j-1Bi(i-1)/2+jCi(i+1)/2+j-1Di(i+1)/2+j 3.一个n*n的对称矩阵,用压缩存储方法处理其对称性质后存储,则其容量为: (C)。 An*nBn*n/2C(n+1)*n/2D(n+1)*(n+1)/2 三.计算题 1.设有一个二维数组A[m][n],假设A[0][0]存放位置在644,A[2][2]存放位置在676,每个元素占一个空间,问A[3][3]存放在什么位置? 写出计算过程。 (676-644)/1=32 A[2][2]的地址相对A[0][0]偏移量为32,则A[3][3]相较于A[0][0]的偏移量为32*3/2=48 A[3][3]地址为48+644=692 2.设A[9][9]是一个10*10对称矩阵,采用压缩存储方式存储其下三角部分,已知每个元素占用两个存储单元,其第一个元素A[0][0]的存储位置在1000,求下面问题的计算过程及结果: 给出A[4][5]的存储位置。 A[4][5]是上三角部分,所以存在A[5][4] 若以行序为主序,则地址为1000+2(5(1+5)/2+4)=1036 若以列序为主序,则地址为1000+2(4(10+7)/2+5)=1062 给出存储位置为1080的元素下标。 i(i+1)/2+j或j(10+10-j+1)/2+i=40 得i=9,j=4或i=8j=5,A[8][5]或A[9][4] 3.一个稀疏矩阵如图所示,则对应的三元组线性表是什么? 其对应的十字链表是什么? 4.下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。 0200 12000 3000 0004 0060 16000 四.算法设计 1.设计一个算法,计算一个三元组表表示的稀疏矩阵的对角线元素之和。 2.若在矩阵A中存在一个元素ai,j(0≤i≤n-1,0≤j≤m-1),该元素是第i行元素中最小值且又是第j列元素中最大值,则称此元素为该矩阵的一个鞍点。 假设以二维数组存储矩阵A,试设计一个求该矩阵所有鞍点的算法,并分析最坏情况下的时间复杂度 voidSaddle(intA[m][n]) //A是m*n的矩阵,本算法求矩阵A中的马鞍点. {intmax[n]={0},//max数组存放各列最大值元素的行号,初始化为行号0; min[m]={0},//min数组存放各行最小值元素的列号,初始化为列号0; i,j;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南京 学院 数据结构 题库 参考答案
![提示](https://static.bdocx.com/images/bang_tan.gif)