数据结构题目及答案.docx
《数据结构题目及答案.docx》由会员分享,可在线阅读,更多相关《数据结构题目及答案.docx(6页珍藏版)》请在冰豆网上搜索。
![数据结构题目及答案.docx](https://file1.bdocx.com/fileroot1/2023-1/23/47aeb831-5cf9-4045-a11b-df721626f3e1/47aeb831-5cf9-4045-a11b-df721626f3e11.gif)
数据结构题目及答案
数据结构题目及答案
《数据结构-C语言版》 第一章绪论 单项选择题 1.在数据结构中,数据的基本单位是_____C____。
A.数据项 B.数据类型 C.数据元素 D.数据变量2.数据结构中数据元素之间的逻辑关系被称为__D____。
A.数据的存储结构B.数据的基本操作C.程序的算法D.数据的逻辑结构3.在数据结构中,与所使用计算机无关的是数据的____C___。
A.存储结构 B.逻辑和物理结构 C.逻辑结构 D.物理结构4.在链式存储结构中,数据之间的关系是通过____B____体现的。
A.数据在内存的相对位置 B.指示数据元素的指针C.数据的存储地址 D.指针5.计算算法的时间复杂度是属于一种____B___。
A.事前统计的方法 B.事前分析估算的方法 C.事后统计的方法 D.事后分析估算的方法 6.在对算法的时间复杂度进行估计的时候,下列最佳的时间复杂度是____D___。
A.n2 B.nlogn C.n D.logn 7.设使用某算法对n个元素进行处理,所需的时间是T(n)=100nlog2n+200n+2000,则该算法的渐近时间复杂度为____D___。
A.O
(1) B.O(n) C.O(200n) D.O(nlog2n) 1 第二章线性表 单项选择题 1.链表不具有的特点是____A____。
A.可随机访问任一元素 B.插入和删除时不需要移动元素C.不必事先估计存储空间 D.所需空间与线性表的长度正比 2.设顺序表的每个元素占8个存储单元。
第1个单元的存储地址是100,则第6个元素占用的最后一个存储单元的地址为 C 。
A.139 B.140 C.147 D.1483.在线性链表存储结构下,插入操作算法 C 。
A.需要判断是否表满 B.需要判断是否表空C.不需要判断表满 D.需要判断是否表空和表满 4.在一个单链表中,若删除p所指结点的后继结点,则执行 A 。
A.p->next=p->next->next; B.p->next=p->next; C.p=p->next->next; D.p=p->next;p->next=p->next->next; 5.将长度为n的单链表接在长度为m的单链表之后的算法时间复杂度为 B 。
A.O(n) B.O
(1) C.O(m) D.O(m+n) 6.需要预分较大空间,插入和删除不需要移动元素的线性表,其存储结构是 B 。
A.单链表 B.静态链表 C.线性链表 D.顺序存储方式填空题 1.在带表头结点的单链表中,当删除某一指定结点时,必须找到该结点的___前驱__结点。
2.在单链表中,指针p所指结点为最后一个结点的条件是 p->next==NULL 。
3.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是 1 。
4.在一个长度为n的顺序表中第i个元素之前插入一个元素时,需向后移动元素的个数是 n-i+1 。
5.在长度为n的顺序表中插入一个元素的时间复杂度为 O(n) 。
例题解析 【例2-1】编写一个算法将一个单链表逆转,要求在原表上进行,不允许重新建链表。
解:
该算法可以在遍历原表的时候将各结点的指针逆转,从原表的第一个结点开始,头结点的指针在最后修改成指向原表的最后一个结点,即新表的第一个结点。
实现本题功能的函数如下:
voidinverse(Lnode*h){s=h->next; if(s==NULL)return; 2 q=NULL; p=s; while(p!
=NULL) {p=p->next; s->next=q; /*逆转指针*/ q=s; /*指针前移*/ s=p; } h->next=q; /*头指针h的后继是p*/} 【例2-2】编写一算法将两个按元素值递增有序排列的单链表A和B归并成一个按元素值递增有序排列的单链表C。
解:
对于两个或两个以上的,结点按元素值有序排列的单链表进行操作时,应采用“指针平行移动,依次扫描完成”的方法。
从两表的第一个结点开始顺链表逐个将对应数据元素进行比较,复制小的并插入c表尾。
当两表中之一已到表尾,则复制另一个链表的剩余部分,插入到c表尾。
设pa、pb分别指向两表当前结点,p指向c表的当前表尾结点。
若设A中当前所指的元素为a,B中当前所指的元素为b,则当前应插入到C中的元素c为 ?
ac?
?
?
b 例如:
A=(3,5,8,11) B=(2,6,8,9,11,15,20) 则 C=(2,3,5,6,8,8,9,11,11,15,20)实现本题功能的函数如下:
Lnode*hb(Lnode*pa,Lnode*pb){Lnode*p,*q,*pc; a?
ba?
bpc=(Lnode*)malloc(sizeof(Lnode)); /*建立表c的头结点pc*/p=pc; /*p指向C表头结点*/while(pa!
=NULL&&pb!
=NULL) {q=(Lnode*)malloc(sizeof(Lnode)); /*建立新结点q*/ if(pb->datadata)/*比较A、B表中当前结点的数据域值的大小*/ {q->data=pb->data; /*B中结点值小,将其值赋给q的数据域*/ pb=pb->next; /*B中指针pb后移*/ } else {q->data=pa->data; /*相反,将A结点值赋给q的数据域*/ pa=pa->next; /*A中指针pa后移*/ } p->next=q; /*将q接在p的后面*/ 3 p=q; /*p始终指向C表当前尾结点*/} while(pa!
=NULL) /*若表A比B长,将A余下的结点链在C表尾*/ {q=(Lnode*)malloc(sizeof(Lnode)); q->data=pa->data; pa=pa->next; p->next=q; p=q;} while(pb!
=NULL) /*若表B比A长,将B余下的结点链在C表尾*/ {q=(Lnode*)malloc(sizeof(Lnode)); q->data=pb->data; pb=pb->next; p->next=q; p=q; } p->next=NULL; p=pc; /*p指向表C的头结点pc*/ pc=p->next; /*改变指针状态,使pc指向p的后继*/free(p); /*释放p空间*/return(pc); } 此算法的时间复杂度为O(m+n),其中m,n分别是两个被合并表的表长。
第三章 单项选择题 栈和队列 1.在初始为空的堆栈中依次插入元素f,e,d,c,b,a以后,连续进行了三次删除操作,此时栈顶元素是 B 。
A.c B.d C.b D.e 2.若某堆栈的输入序列是1,2,3,...,n,输出序列的第一个元素为n,则第i个输出元素为 C 。
A.i B.n-i C.n-i+1 D.哪个元素无所谓 3.向一个栈顶指针为h的带头结点链栈中插入指针s所指的结点时,应执行 D 。
A.h->next=s; B.s->next=h; C.s->next=h;h=h->next; D.s->next=h->next;h->next=s; 4 4.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是 C 。
A.edcba B.decbaC.dceab D.abcde5.栈和队列的共同点是 C 。
A.都是先进后出 B.都是先进先出C.只允许在端点处插入和删除元素 D.没有共同点6.对于循环队列 D 。
A.无法判断队列是否为空 B.无法判断队列是否为满 C.队列不可能满 D.以上说法都不是 7.若用一个大小为6的数组来实现循环队列,且当前队尾指针rear和队头指针front的值分别为0和3。
当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为A。
A.1和5 B.2和4 C.4和2 D.5和18.判定一个循环队列QU为满队列的条件是 C 。
A.QU->front==QU->rear B.QU->front!
=QU->rear C.QU->front==(QU->rear+1)%m0 D.QU->front!
=(QU->rear+1)%m09.判定一个循环队列QU为空的条件是 A 。
A.QU->front==QU->rear B.QU->front!
=QU->rear C.QU->front==(QU->rear+1)%m0 D.QU->front!
=(QU->rear+1)%m0填空题 1.在求表达式值的算符优先算法中使用的主要数据结构是 栈。
2.设有一个空栈,现输入序列为1,2,3,4,5。
经过push,push,pop,push,pop,push,pop,push后,输出序列是 234 。
3.仅允许在同一端进行插入和删除的线性表称为 栈 。
7.在顺序栈s中,栈为空的条件是 == ,栈为满的条件是___>=__。
4.用S表示入栈操作,X表示出栈操作,若元素入栈顺序为1234,为了得到1342出栈顺序,相应的S、X操作串为 SXSSXSXX 。
5.用一个大小为1000的数组来实现循环队列,当前rear和front的值分别为0和994,若要达到队满的条件,还需要继续入队的元素个数是 993 。
例题解析 【例3-1】编程实现:
用除法把十进制数转换成二进制数。
解:
算法思想:
用初始十进制数除以2把余数记录下来并且若商不为0则再用商去除以2直到商为0,这时把所有的余数按出现的逆序排列起来就得到了相应的二进制数,如把十进制数35转换成二进制数的过程如图3-1所示。
5
351784210 余数11001 结果:
10011 图3-1十进制数转换成二进制数的过程 题意可知,我们可以用一个栈来保存所有的余数,当商为0时则让栈里的所有余数出栈则可以得到正确的二进制数,算法可描述如下:
voidconversion(){StackS;intn;InitStack(&S); printf(\scanf(\if(n printf(\return;} if(n==0)Push(S,0);while(n!
=0){ Push(S,n%2);n=n/2;} printf(\while(!
StackEmpty(*S)){ printf(\}}} 6 第四章串 单项选择题 1.串是一种特殊的线性表,其特殊性体现在 B 。
A.可以顺序存储 B.数据元素是一个字符C.可以链接存储 D.数据元素可以是多个字符 2.设有两个串p和q,求q在p中首次出现的位置的运算称作 B 。
A.连接 B.模式匹配 C.求子串 D.求串长3.串是一个 B 的序列。
A.不少于一个字母 B.有限个字符 C.不少于一个字符 D.空格或字母4.已知串s=’ABCDEFGH’,则s的所有不同子串的个数为 D 。
A.8 B.9 C.36 D.37填空题 1.两个串相等的充分必要条件是两个串的长度相等且对应位置的字符相同。
2.空格串是一个或多个空格字符组成的串,其长度等于其包含的空格个数 。
3.在串S=’tuition’中,以t为首字符且值不相同的子串有 10 个。
4.使用“求子串”substring(S,pos,len)和“联接”concat(S1,S2)的串操作,可从串s=’conduction’中的字符得到串t=’cont’,则求t的串表达式为concat(subString(s,1,3),substring(s,7,1))。
第五章数组与广义表 单项选择题 1.常对数组进行的两种操作是 C 。
A.建立与删除 B.索引和修改 C.查找和修改 D.查找与索引2.假设8行10列的二维数组a[1..8,1..10]分别以行序为主序和以列序为主序顺序存储时, 其首地址相同,那么以行序为主序时元素a[3][5]的地址与以列序为主序时元素 ____D___的地址相同。
A.a[5][3] B.a[8][3] C.a[1][4] D.答案A、B、C均不对3.将一个A[1..100,1..100]的三对角矩阵以行序为主序存入一维数组B[1..298]中,元素A[66,65]在B数组中的位置k等于____D___。
A.198 B.197 C.196 D.195 4.稀疏矩阵一般的压缩存储方法有两种,即 C 。
A.二维数组和三维数组 B.三元组和散列C.三元组和十字链表 D.散列和十字链表5.一个非空广义表的表头____D___。
7 A.不可能是子表 B.只能是子表 C.只能是原子D.可以是原子或子表6.设head(L)、tail(L)分别为取广义表表头、表尾操作,则从广义表L=((x,y,z),a,(u,v,w))中取出原子u的运算为____D___。
A.head(tail(tail(head(L)))) B.tail(head(head(tail(L)))) C.head(tail(head(tail(L)))) D.head(head(tail(tail(L))))7.广义表(a,((b,(c,d,(e,f))),g))的深度为____C___。
A.3 B.4 C.5 D.6填空题 1.将下三角矩阵A[1..8,1..8]的下三角部分逐行地存储到起始地址为1000的内存单元中,已知每个元素占四个单元,则元素A[7,5]的地址为 1100 。
2.二维数组A[0..9,0..19]采用行序为主方式存储,每个元素占一个存储单元,并且元素A[0,0]的存储地址是200,则元素A[6,12]的地址是 332 。
3.二维数组A[10..20,5..10]采用行序为主方式存储,每个元素占4个存储单元,并且元素A[10,5]的存储地址是1000,则元素A[18,9]的地址是 1208 。
4.有一个10阶对称矩阵A,采用压缩存储方式,则元素A[8,5]的地址是 42 。
5.设HAED[p]为求广义表p的表头函数,TAIL[p]为求广义表p的表尾函数,其中 是函数的符号,给出下列广义表的运算结果:
HEAD[(a,b,c)]的结果是 ① 。
TAIL[(a,b,c)]的结果是 ② 。
HEAD[((a),(b))]的结果是 ③ 。
TAIL[((a),(b))]的结果是 ④ 。
HEAD[TAIL[(a,b,c)]的结果是 ⑤ 。
TAIL[HEAD((a,b),(c,d))]的结果是 ⑥ 。
HEAD[HEAD[(a,b),(c,d))]]的结果是 ⑦ 。
TAIL[TAIL[(a,(c,d))]]的结果是 ⑧。
①a;②(b,c);③(a);④((b));⑤b;⑥(b);⑦a;⑧() 第6章树和二叉树 选择题 1.以下说法错误的是 A 。
A.树形结构的特点是一个结点可以有多个直接前趋B.线性结构中的一个结点至多只有一个直接后继C.树形结构可以表达(组织)更复杂的数据D.树(及一切树形结构)是一种\分支层次\结构 8 2.如图6-2所示的4棵二叉树中, C 不是完全二叉树。
图6-24棵二叉树 3.以下说法错误的是 D 。
A.完全二叉树上结点之间的父子关系可它们编号之间的关系来表达B.在三叉链表上,二叉树的求双亲运算很容易实现C.在二叉链表上,求根,求左、右孩子等很容易实现D.在二叉链表上,求双亲运算的时间性能很好 4.如图6-3所示的4棵二叉树, B 是平衡二叉树。
图6-34棵二叉树 5.如图6-4所示二叉树的中序遍历序列是 B 。
A.abcdgef B.dfebagc C.dbaefcg D.defbagc abcdgef 图6-41棵二叉树 6.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf, 9 则其后序遍历的结点访问顺序是 D 。
A.bdgcefha B.gdbecfha C.bdgaechf D.gdbehfca 7.将含有83个结点的完全二叉树从根结点开始编号,根为1号,后面按从上到下、从左到右的顺序对结点编号,那么编号为41的双亲结点编号为 D 。
8.一棵二叉树如图6-5所示,其后序遍历的序列为 C 。
A.abdgcefh B.dgbaechf C.gdbehfca D.abcdefgh abcdefgh图6-51棵二叉树 9.深度为5的二叉树至多有 C 个结点。
A.16 B.32 10.设深度为k的二叉树上只有度为0和度为2的节点,则这类二叉树上所含结点总数至少有C个。
+1 +1 11.对含有 B 个结点的非空二叉树,采用任何一种遍历方式,其结点访问序列均相同。
D.不存在这样的二叉树填空题 1.有一棵树如图6-7所示,回答下面的问题:
k1k2k3k4k5k6k7图6-71棵二叉树 这棵树的根结点是 ① ; 10
11136(a)115346(b)34111346(c)1153354642242242(d)(e) 图7-11普里姆算法构造最小生成树的过程 4.使用克鲁斯卡尔算法构造出如图7-7所示的图G的一棵最小生成树。
16776425202351541812810253 图7-7无向图G 解:
使用克鲁斯卡尔算法构造棵最小生成树的过程如图7-12所示。
21 1256374125346(a)(b)6(c)16742583764112525836(d)464(e)16181245825376(f)4 图7-12克鲁斯卡尔算法构造最小生成树的过程 第8章查找 单项选择题 1.顺序查找法适合于存储结构为 B 的线性表。
A.散列存储 B.顺序存储或链接存储C.压缩存储 C.索引存储 2.对线性表进行折半查找时,要求线性表的存储方式是 C 。
A.顺序存储B.链接存储 C.以关键字有序排序的顺序存储D.以关键字有序排序的链接存储 3.对有18个元素的有序表作二分查找,则查找A[3]的比较序列的下标为D。
A. B. C. D. 4.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用A查找方法。
22 A.分块 B.顺序 C.二分 D.散列 5.有一个有序表为{2,5,7,11,22,45,49,62,71,77,90,93,120},当折半查找值为90的结点时,经过 C 次比较后查找成功。
A.1 B.2 C.4 D.8 6.设哈希表长m=14,哈希函数H(key)=key%11。
表中已有4个结点:
addr(14)=3,addr(38)=5,addr(61)=6,addr(85)=8,其余地址为空,如用线性探测再散列处理冲突,关键字为49的结点的地址是 A 。
A.7 B.3 C.5 D.4 7.在采用链接法处理冲突的开散列表上,假定装填因子a的值为4,则查找任一元素的平均查找长度为 A 。
A.3 填空题 1.在各种查找方法中,平均查找长度与结点个数n无关的查法方法是 散列表查找 。
2.二分查找的存储结构仅限于 有序的顺序存储结构 。
3.在散列存储中,装填因子α的值越大,则①;α的值越小,则②。
①存取元素时发生冲突的可能性就越大②存取元素时发生冲突的可能性就越小4.对于二叉排序树的查找,若根结点元素的键值大于被查元素的键值,则应该在二叉树的______左子树_____上继续查找。
5.高度为8的平衡二叉树至少有___54____个结点。
6.在散列函数H(key)=key%p中,p应取 素数 。
例题解析 【例8-1】设有一组关键字{19,01,23,14,55,20,84,27,68,11,10,77},采用哈希函数:
H(key)=key%13,采用开放地址法的二次探测再散列方法解决冲突,试在0~18的散列地址空间中对该关键字序列构造哈希表。
解:
依题意,m=19,二次探测再散列的下一地址计算公式为:
d1=H(key) d2j=(d1+j*j)%m d2j?
1=(d1-j*j)%m;j=1,2,...其计算函数如下:
H(19)=19%13=6 H(01)=01%13=1 23 H(23)=23%13=10 H(14)=14%13=1(冲突) H(14)=(1+1*1)%19=2H(55)=55%13=3 H(20)=20%13=7 H(84)=84%13=6(冲突) H(84)=(6+1*1)%19=7(仍冲突) H(84)=(6-1*1)%19=5 H(27)=27%13=1(冲突) H(27)=(1+1*1)%19=2(冲突) H(27)=(1-1)%19=0 H(68)=68%13=3(冲突) H(68)=(3+1*1)%19=4 H(11)=11%13=11 H(10)=10%13=10(冲突) H(10)=(10+1*1)%19=11(仍冲突) H(10)=(10-1*1)%19=9 H(77)=77%13=12 因此:
各关键字的记录对应的地址分配如下:
addr(27)=0 addr(01)