1、数据结构习题1数 据 结 构 习 题 册(仅供计算机和信息专业同学参考)计 算 机 科 学 技 术 教 研 室二八年十一月基础篇习题1一、选择题1 计算机算法必须具备输入、输出、(B )等5个特性。A 可行性、可移植性和可扩展性 B 可行性、确定性和有穷性C 确定性、有穷性和稳定性 D 易读性、安全性和稳定性2 在数据结构中,从逻辑上可以把数据结构分为(D )A 动态结构和静态结构 B 紧凑结构和非紧凑结构C 内容结构和外部结构 D 线性结构和非线性结构3 下面程序段的时间复杂性的量级为(D )For (i=1;i=n;i+) For(j=1;j=I;j+) For(k=1;k=j;k+) x
2、=x+1;A O(1) B O(n) C O(n2) D O(n3)4 在数据结构中,与所使用的计算机无关的是数据的(A )结构A 逻辑 B 存储 C 逻辑和存储 D 物理5 数据结构在计算机中的表示是指(C )A 数据的逻辑结构 B 数据结构 C 数据的存储结构 D 数据元素之间的关系6 下面(B )的时间复杂性最好,即执行时间最短。A O(n) B O(logn) C O(nlogn) D O(n2)7 下面程序段的时间复杂性的量级为(D )。Int fun(int n)I=1,s=1;While(sn)s+=+I;return I;A O(n/2) B O(logn) C O(n) D
3、O(n1/2)8 下面程序段的时间复杂性的量级为(C)。For(int i=0;im;i+)For(int j=0;jn;j+) Aij=i*j;A O(m3) B O(n2) C O(m*n) D O(m+n)9 执行下面程序段时,S 语句的执行次数为(A)。 For(int i=1;in-1;i+)For(int j=i+1;j=n;j+) S;A n(n-1)/2 B n2/2 C n(n-1)/2 D n二、简答题1 数据的逻辑结构有哪几种?常用的存储有哪几种?集合 线性结构 树形结构 图状结构 顺序存储结构 链式存储结构2 举一个数据结构的例子,叙述其逻辑结构、存储结构和运算三方面的
4、内容。3 什么叫算法?它有哪些特性4 有下列几种用二元组表示的数据结构,画出它们分别对应的逻辑结构图,并指出它们分别以属于何种结构。(1)A=(K,R),其中 K=a,b,c,d,e,f,g,h R=r r=,(2) B=(K,R),其中 Ka,b,c,d,e,f,g,h R=r r=,(3) B=(K,R),其中 K=1,2,3,4,5,6 R=r r=(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)三、计算题设n为整数,求下列各程序段的时间复杂度(1)i=1;k=2;While(in) k=k+10*I; i=i+1;(2)i=1;j=0; W
5、hile(i+jj)j=j+1;Else i=i+1;(3)x=91;y=100 While(y0) If(x100) x=x-10; y=y-1; else x=x+1;习题1参考答案一、选择题1. B 2. D 3. D 4. A 5. C 6. B 7. D 8. C 9. A二、简答题1. 答:数据的逻辑结构通常有四种,即集合、线性结构、树形结构和图状结构。存储结构主要有顺序存储结构和链式存储结构。2. 答:比如一分通讯录,记录了相关人员的电话号码,将其按姓名一人占一行构成表,这个表就是一个数据结构。每一行是一个记录,对于整个表来说,只有一个开始结点和一个终端结点,其它结点也只有一个前
6、驱和一个后继。这几个关系就确定了表的逻辑结构。3. 答:算法是对特定问题求解步骤的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。算法具有有穷性、确定性、可行性、输入和输出5个特性。4.答: (1) A对应的逻辑图形如下图左,它是一种线性结构。(2) B对应的逻辑图形如上图右所示,它是一种树型结构。(3) C对应的逻辑图形如下图所示,它是一种图型结构。三、计算题解: (1) O(n) ; (2) O(n) ; (3) O(n1/2)。习题2一、选择题1 线性表是(A)A 一个有限序列,可以为空 B 一个有限序列,不能为空C 一个无限序列,可以为空 D 一个无限序列,不能为空2 在
7、一个长度为n的顺序表中,向第iI个元素(1in+1)位置插入一个新元素时,需要从后向前依次后移(B)个元素。A n-i B n-i+1 C n-i-1 D i3 在一个顺序表的表尾插入一个元素的时间复度的量级为(B)。A O(n) B O(1) C O(n2) D O(log n)4 表长为n的顺序存储的线性表,当在任意位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均个数为(C),删除一个元素需要移动元素的平均个数为(D)A (n-1)/2 B n C (n+1)/2 D n/25 设单链表中指针p指向结点a,若要删除p之后的结点(若存在),则需修改指针的操作为(A)。A
8、p-next=p-next-next B p=p-nextC p=p-next-next D next=p6 单链表的存储密度为(C)。A 大于1 B 等于5 C 小于1 D 不能确定7 在一个单链表中,若要在p所指向的结点之后插入一个新结点,则需要相继修改(B)个指针域的值。A 1 B 2 C 3 D 48 在一个单链表中,若要在p所指向的结点之前插入一个新结点,则此算法的时间复杂度的量级为(A)。A O(n) B O(n/2) C O(1) D O(n1/2)9 在一个带头结点的双向循环链表中,若要在p所指向的结点之前插入一个新结点,则需要相继修改(C)个指针域的值。A 2 B 3 C 4
9、 D 6二、简答题1 什么叫线性表?它有哪些特点?2 在链表的设计中,为什么通常采用带头结点的链表结构?3 对比顺序表与单链表,说明顺序表与单链表的主要优点和主要缺点。4 试编写算法实现顺序表的逆置,即把顺序表A中的数据元素(a1,a2, ,an)逆置为(an,an-1, ,a1)。5 已知A和B为两个非递减的线性表,现要求实现如下操作:从A中删除在B中出现的元素。试编写在顺序表中实现上述操作的算法。6 试编写算法实现链表的就地逆置(不增加存储空间),即把链表A中的数据元素(a1,a2, ,an)逆置为(an,an-1, ,a1)。7 假设有两个非递减的线性表A 和B,均采用链式存储结构,试编
10、写算法将A和B 归并成一个按元素非递减的线性表C。8 试编写算法求单循环链表的表长。1. A 2. B 3. B 4. D A5. A 6. C 7. B 8. A 9. C二、简答题1. 答:线性表是具有n个数据元素的一个有限序列。线性表的特点是:数据元素之间是一对一的关系。除第一个元素外,每个元素有且只有一个直接前驱;除最后一个元素外,每个元素有且只有一个直接后继。2. 答:头指针是链表的一个标识,它用来指向带头结点的链表中的头结点。头结点是在链表的第一个数据元素之前附加的一个结点,它的作用是使对第一个结点的操作和其它结点一致,表空与非空时处理一致,不需要特殊处理,简化了操作。3. 答:顺
11、序表的特点是逻辑位置相邻的数据元素其物理位置也相邻,因此可以进行随机存储, 是一种随机存储结构。其插入和删除操作的时间复杂度均为O(n)。链表中的数据元素使用一组任意的存储单元存储,不要求逻辑位置相邻的数据元素物理位置也相邻,而是采用附加的指针表示元素之间的逻辑关系。链表的插入和删除结点均不需要移动其他结点,但是,其查找运算必须从头指针开始顺序查找,其时间复杂度为O(n)。4. 答:算法如下void Convert(SqList &L) int i,j,temp; j=L.length-1; i=0; while(ij) temp=L.elemi; L.elemi=L.elemj; L.ele
12、mj=temp; i+; j-; 5. 答:算法如下 void Delete(SqList &La,SqList Lb) int i,j,k; i=0;j=0; while(iLa.length&jLb.length) if(La.elemiLb.elemj) j+; else ListDelete_Sq(La, i+1, k); 6. 答:算法如下void InvertList(LinkList &L) LinkList p,q,r; p = L-next; q = p-next; p-next=NULL; while(q!=NULL) r=q-next; q-next=p; p=q; q=
13、r; L-next=p;7. 答:算法如下void MergeOrder(LinkList La,LinkList Lb) LinkList pa,pb,Lc,pc; pa=La-next; pb=Lb-next; Lc=pc=La; while (pa&pb) if(pa-data data ) pc-next=pa; pc=pa; pa=pa-next; else pc-next=pb; pc=pb; pb=pb-next; if (!pa) pc-next=pb; else pc-next=pa;8. 答:算法如下int Length(LinkList L) int i=0; LinkL
14、ist p; p=L-next; while(p) p=p-next; i+; return i;习题3一、选择题 1在栈顶一端可进行的全部操作是( )。A 插入 B 删除 C插入和删除 D进栈2 栈的特点是( )。A 先进先出 B 后进先出 C后进后出 D不进不出3 顺序栈是空栈的条件是( )。A top=0 B top=1 C top=-1 D top=m4 假定利用数组AN顺序存储一个栈,top表示栈顶指针,已知栈未满,则x入栈时所执行的操作是( )。A a-top=x; B atop-=x C a+top=x D atop+=x5 一个栈的入栈序列是a,b,c,d,e,则不可能的出栈序
15、列是( )。A edcda B dceab C decba D abcde6 经过下列栈的运算后EmptyStack(s)的值是( )。InitStack(s);Push(s,a);Push(s,b);Pop(s,x);Pop(s,x) ;A a B b C 1 D 07 若已知一个栈的入栈序列是1,2,3, ,n,其输出序列为p1,p2,p3,pn,若p1=n,则pi为( )。A i B n-i C n-i+1 D 不确定8 队列的特点是()。A 先进先出 B 后进先出 C先进后出 D 不进不出9 循环队列S为满的条件是()。A S-rear=S-frontB S-rear+1)%maxsi
16、ae=s-frontC S-rear=0D s-front=010 经过下列运算后GetHead(Q)的值是()。InitQueue(Q); EnQueue(Q,a); EnQueue(Q,b); DeQueue(Q,x);A a B b C 1 D 2二、简答题1 简述栈与队列的相同点与不同点。2 在顺序队列中,什么叫真溢出?什么叫假溢出?为什么顺序队列常都采用循环队列结构?3 设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(不设头指针),试编写相应的入队列、出队列算法。4 设计一个输出如下形式数值的递归算法。4 4 4 43 3 32 215 编写一个算法,利用栈的基本运
17、算返回指定栈中的栈底元素。习题3参考答案一、选择题1. C 2. B 3. A 4. D 5. B 6. C7. C 8. A 9. B 10. B二、简答题1. 答:栈是限定在表的一端进行插入和删除操作的线性表。队列是只允许在表的一端进行插入,而在另一端进行删除元素的线性表。栈的操作是按照后进先出原则进行的,因此又称作后进先出的线性表。队列的操作是按照先进先出原则进行的,因此又称作先进先出的线性表。2. 答:当front0,rear=M时,再有元素入队发生溢出,称之为“假溢出”,存储空间还有剩余。为了改进这种状况,可以将顺序队列想象为一个首尾相接的环状空间,称之为循环队列。3. 答:(1)
18、相应入队列操作Status EnQueue_L (LinkQueue &Q, ElemType e) p = (QLink) malloc (sizeof (QNode); p-data = e; p-next=Q-next; Q-next = p; Q = p; return OK;(2) 相应出队列的操作Status DeQueue_L (LinkQueue &Q, ElemType &e) if (Q-next = Q) return ERROR; p = Q.next-next; e = p-data; Q-next-next = p-next; free(p); return OK;
19、4.答:算法如下void Print(int n) int i; if (n=0) return; for (i=1;i=n;i+) printf(%3d,n); printf(n); Print(n-1);5.答:算法如下 ElemType Bottom(Stack S) ElemType x,y; Stack T; InitStack(T); while (!StackEmpty(S) pop(S,x); push(T,x); while (!StackEmpty(T) pop(T,y); push(S,y); return x;习题4一、选择题1 串是一种特殊的线性表,其特殊性体现在(
20、)A 唯一可以顺序存储 B 数据元素是一个字符C 可以链接存储 D 数据元素可以是多个字符2 下面( )是C语言中“abcd321ABCD”的子串。A abcd B 321AB C “abcAB” D “21AB”3 设有两个串p和q,求p和q首次出现的位置的运算称作( )A 连接 B 模式匹配 C 求子串 D 求串长4 设有一个字符串S=“windows”,求子串的数目是()A 25 B 26 C 27 D 28二、简答题1 空串与空格串有什么区别?字符串中的空格有什么意思?空串在串的处理中有什么作用?2串是由字符组成的,长度为1的串和字符是否相同?为什么?3简述串的静态顺序存储结构与动态顺
21、序存储结构有什么区别,分别写出它们的结构体定义。4字符串采用静态顺序存储结构。编写一个算法删除S中地i个字符到第j个字符。5编写一个算法判断s2是否是s1的子串。习题4参考答案一、选择题1. B 2. D 3. B 4. D 二、简答题1. 答:长度为零的串称为空串,记作。空格也是串的字符集合中的一个元素,由一个或多个空格组成的串称为空格串。例如 ,其长度为串中空格的个数。2. 答:虽然串是由字符组成的,但串和字符是两个不同的概念。串是长度不确定的字符序列,而字符只是一个字符。即使是长度为1的串也与字符不同。例如,串a和字符a就是两个不同的概念,因为在存储时串的结尾通常加上串结束标志0。3.
22、答:在串的顺序存储结构是用一维数组存放串中的字符。一种方法是用静态内存分配的方法定义的数组,数组元素的个数是在编译时确定的,在运行时是不可改变的,称之为静态顺序存储。另一种方法是用动态内存分配的方法定义的数组,数组元素的个数是在程序运行时用户申请确定的,称之为动态顺序存储。4. 答:Status StrDelete (String &S,int i,int j) int len; len=j-i+1; if (iS0| jS0) / 非法情况的处理 return ERROR; Spos.S0-len=Spos+len.S0; / 将S中从下标从pos+len开始的元素前移len位 S0=S0-
23、len; / 串长的处理 return OK;5. 答:Status SubString(String S1,String S2) int i,j,k,flag=0; i=1; while(i1)的递归出口是( )A f(1)=0 B f(1)=1 C f(0)=1 D f(n)=n二、简答题1什么叫二维数组的行序优先存储?什么叫二维数组的列序优先存储?2什么样的矩阵叫特殊矩阵?特殊矩阵压缩存储的基本思想是什么?3什么样的矩阵叫稀疏矩阵?稀疏矩阵压缩存储的基本思想是什么?三、计算题设有二维数组A(6*8),每个元素占4个字节,A00的起始地址为1000,计算(1) 数组A共占多少个字节;(2)
24、 数组的最后一个元素A57的起始地址;(3) 按行优先存放时,元素A14的起始地址;(4) 按列优先存放时,元素A47的起始地址;四、设计题1对于二维数组Amn,其中m=80,n=80,先读入m和n ,然后读该数组的全部元素,对如下三种情况分别编写相应函数:(1)求数组A靠边元素之和; (2)求从A00开始的互不相邻的各元素之和; (3)当m=n时,分别求两条对角线上的元素之和,否则打印出m!=n的信息。2有数组A44,把1到16个整数分别按顺序放入A00,A03,A10,A13,A20,A23,A30,A33中,编写一个函数获得数据并求出两条对角线元素的乘积。习题5参考答案一、选择题1. D
25、 2. B 3. A 4. D 5. B 6. B二、简答题1. 答:所谓行序优先存储,其基本思想为:从第1行的元素开始按顺序存储,第1行元素存储完成后,再按顺序存储第2行的元素,然后依次存储第3行,直到最后一行的所有元素存储完毕为止。而列序优先存储即为:依次按顺序存储第1列,第2列,直到最后一列的所有元素存储完毕为止。2. 答:我们把相同的元素或零元素在矩阵中的分布有一定的规律的称为特殊矩阵。压缩存储的原则是:对多个值相同的元素只存储一次,对零元素甚至不分配存储空间。3. 答:矩阵中非零元素的个数远远小于矩阵元素的总数,这样的矩阵称为稀疏矩阵。稀疏存储的原则是只存储非零元。三、计算题(1)
26、228 (2) 1282 (3) 1072 (4) 1276四、设计题1 void proc1(matrix A) /*第(1)题解*/ int s=0,i,j; for(i=0;im;i+) /*第一列*/ s=s+Ai1; for(i=0;im;i+) /*最后一列*/ s=s+Ain; for(j=0;jn;j+) /*第一行*/ s=s+A1j; for(j=0;jm;j+) /*最后一行*/ s=s+Amj; s=s-A00-A0n-1-Am-10-Am-1n-1; /*减去4个角的重复元素值*/ printf(s=%dn,s);void proc2(matrix A) /*第(2)题解*/ int s=0,i,j; i=0; while(im) j=0; while(jn) s=s+Aij; j=j+2; /*跳过一列*/ i=i+2; /*跳过一行*/ printf(s=%dn,s);void p
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1