数据结构模拟试卷1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构模拟试卷1
(总分:44.00,做题时间:90分钟)
一、单项选择题(总题数:12,分数:24.00)
1.(江苏大学)下面关于串的叙述中,( )是不正确的。
A.串是字符的有限序列
B.空串是由空格构成的串√
C.模式匹配是串的一种重要运算
D.串既可以采用顺序存储,也可以采用链式存储
选项A:串是零个或多个字符组成的有限序列,一般记为:S=''a 1 a 2…a n ",S称为串名,双引号括起来的字符序列是串值,将串值括起来的双引号本身不属于串,它的作用是避免串与常数或标识符混淆,故
A选项正确。
选项B:窒皇是指长度为零的串,它不包括任何字符。
但是考生要注意与空白串进行区分,
空白串是指由一个或者多个空格组成的串,故B选项错误。
选项C:模式匹配是一个比较复杂的串操作,是子串在主串中的定位操作。
常用的模式匹配算法有朴素的原始匹配算法和经过优化改进的无回溯算法,
故C选项正确。
选项D:串是特殊的线性表,所以串的存储结构与线性表的存储结构类似。
串的顺序存储结构简称顺序串,顺序串又可按存储分配的不同分为静态存储分配的顺序串和动态存储分配的顺序串。
串
的链式存储就是用单链表的方式存储串值,故D选项正确。
2.(华中科技大学)若串S="bioinformatics'',其子串的个数是( )。
A.15
B.95
C.35
D.106 √
对于长度为n的字符串来说,其子串的个数为{n(n+1)/2}+1(最后+1是因为空串是任何串的子串),记住
即可。
此题n=14,所以其子串的个数是106。
3.(中国科学院)串是一种特殊的线性表,其特殊性体现在( )。
A.数据元素是一个字符√
B.可以顺序存储
C.数据元素可以是多个字符
D.可以链式存储
选择这道题的原因是它被多所学校(武汉大学、中科院、大连理工、江苏大学等)原题考查,考生只需记住
一句话:串是一种特殊的线性表,其特殊性体现在数据元素是一个字符。
4.(中南大学)求字符串T在字符串S中首次出现的位置的操作称为( )。
A.求串的长度
B.求子串
C.串的模式匹配√
D.串的连接
第一题已经讲过,子串在主串中的定位操作称为模式匹配。
例如A和B分别为: A="This is a string'
B=''is…则B是A的子串,B在A中出现了两次。
其中首次出现对应的主串位置是3。
因此称B在A中的
序号(或位置)是3。
5.(江苏大学)串“ababaaababaa'’的next数组为( )。
A.-1,0,1,2,3,4,5,6,7,8,8,8
B.-1,0,1,0,1,0,0,0,0,1,0,1
C.-1,0,0,1,2,3,1,1,2,3,4,5 √
D.-1,0,1,2,-1,0,1,2,1,1,2,3,4
做出模式串以及对应字符下标,串长度为0时,next[0]=-1;S串长度为1时,next[1]=0;S串长度为2时,S串为“ab”next[2]=0; S串长度为3时,S串为“aaba”next[3]=1; (S串中下画线标出了其串首位置以及末尾位置的最长匹配串对,由此可求得当前next值) S串长度为4时,S串为“abab”
next[4]=2; S串长度为5时,S串为“ababa”next[5]=3;S串长度为6时,S串为“,ababaa”next[6]=1;S串长度为7时,S串为“a_babaaa”next[7]=1; S串长度为8时,S串为“ababaaab”next[8]=2; S
串长度为9时,S串为“ababaaaba”next[9]=3; S串长度为10时,S串为“ababaaabab”next[10]=4;S串长度为11时,S串为“ababaaababa”next[11]=5;综上,next数组值为:-1,0,0,1,2,3,1,1,2,3,4,5
6.(湖南大学)稀疏矩阵一般的压缩存储方法有两种,即( )。
A.二维数组和三维数组
B.三元组和散列
C.三元组和十字链表√
D.散列和十字链表
稀疏矩阵进行压缩存储通常有两种方法:顺序存储(三元组)和链式存储(十字链表)。
7.(中山大学)用十字链表表示一个稀疏矩阵,每个非零元一般用一个含有( )个域的结点表示。
A.2
B.3
C.4
D.5 √
存储稀疏矩阵的十字链表结点包含5个域:该非零元的行下标、该非零元的列下标、该非零元的值、该非零元所在行表的后继链域以及该非零元所在列表的后继链域。
8.(南京林业大学)设广义表L=(((a))),则该广义表的长度是( ),深度是( )。
A.1,1
B.3,3
C.3,1
D.1,3 √
广义表的长度就是元素的个数,该广义表最外层括号里面只有一个元素((a)),故该广义表的长度为1;而括号最多层次为3,故该广义表的深度为3。
9.(北京师范大学)已知广义表A=((a,b,c),(d,e,f)),试问从A中取出原子e的操作运算是( )。
A.tail(head(A))
B.head(tail(A))
C.head(tail(tail(head(A))))
D.head(tail(haead(tail(A)))) √
第一步:tail(A)=((d,e,f)) 第二步:head(tail(A))=(d,e,f) 第三步:tail(haead(tail(A)))=(e,
f) 第四步:head(tail(head(tail(A))))=e
10.(重庆大学)对于广义表,通常采用的存储结构是( )。
A.数组
B.链表√
C.Hash表
D.三元组
广义表通常采用链表作为存储结构,只是数据域有的时候是数据,有的时候是指向新表的指针;三元组一般用于存储稀疏矩阵结构;Hash表一般用于存储针对查找操作的数据结构。
11.(南京林业大学)一个非空广义表的表头( )。
A.不可能是子表
B.只能是子表
C.只能是原子
D.可以是子表或原子√
根据表头、表尾的定义可知:任何一个非空广义表的表头是表中第一个元素,它可以是原子,也可以是子表;而其表尾必定是子表。
12.(华中科技大学)广义表((a,b),c,(d,(e)))的表尾是( )。
A.(d,(e))
B.((d,(e)))
C.e
D.(c,(d,(e))) √
二、填空题(总题数:7,分数:14.00)
13.(哈尔滨工程大学)两个字符串相等的充要条件是:两个串的______相等,且______的字符相等。
__________________________________________________________________________________________ 正确答案:(正确答案:长度,对应位置)
14.(重庆大学)操作StrDelete(&s,pos,len)从串s(其长度为L)中删除第pos个字符起长度为len的子串,要求pos满足______。
__________________________________________________________________________________________ 正确答案:(正确答案:1≤pos≤L-len+1)
pos必须满足被删除子串的起始位置不能少于s的第一个字符,子串的最后一个位置不能大于s的最后一个字符,所以1≤pos≤L-len+1。
15.(哈尔滨工程大学)在字符串S=“structure”中,以t为首的子串有______个。
__________________________________________________________________________________________ 正确答案:(正确答案:11)
11个子串分别为:t、tr、tru、truc、truct、tructu、tructur、tructure、tu、tur、ture。
16.(山东大学)广义表(a,(a,b),d,e,((i,j),k))的长度是______,深度是______。
__________________________________________________________________________________________ 正确答案:(正确答案:5,3)
最外层的括号有五项,分别是a、(a,b)、d、e、((i,j),k),故该广义表的长度为5;i和j的层次最深,都是3,所以该广义表的深度为3。
17.(青岛大学)广义表Glist=(a),则表尾为______。
__________________________________________________________________________________________ 正确答案:(正确答案:(a))
18.(青岛大学)已知广义表Glist=((a),(b,c,d),((e))),使用head()和tail()函数取出Glist中原子b的运算是______。
__________________________________________________________________________________________ 正确答案:(正确答案:head(1aead(tail(Glist))))
tail(Glist)=((b,c,d),((e))); head(tail(Glist))=(b,c,d); head(head(tail(G1ist)))=b。
19.(武汉大学)与普通的线性表不同的是,广义表的元素既可以是______,也可以是______。
__________________________________________________________________________________________ 正确答案:(正确答案:数据元素、子表)
广义表是线性表的推广,即广义表中放松对表元素的原子限制,允许它们具有其自身结构,广义表的元素既可以是数据元素,也可以是子表。
三、设计题(总题数:3,分数:6.00)
20.(北京理工大学)抽象数据类型可以用三元组(D,S,P),其中的D,S,P分别表示什么?你认为定义抽象数据类型的主要目的是什么?
__________________________________________________________________________________________ 正确答案:(正确答案:抽象数据类型的三元组(D,S,P)中的D表示数据,S表示关系,P表示操作。
抽象数据类型的定义可以由一种数据类型和定义在其上的一组操作组成,抽象数据类型的特征是使得使用与实现相分离,实现封装与数据隐藏。
)
21.用类C语言写出求广义表深度以及复制广义表的算法。
__________________________________________________________________________________________ 正确答案:(正确答案:定义一个广义表类型如下: typedef Struct node{ int flag; union { elemType data; struct node *pointer; }; struct node *1ink; } BSNode,*BSLinkList;//求广义表深度 int genlistDepth(BSLinkList 1ist){ /*1ist存放广义链表的首地址,该算法返回广义链表的深度*/ BSLinkList stackl[M],p,/*stackl用来记录子表的起始位置*//*stack2用来记录子表当前的深度,depth用来表示当前所求子表的深度,maxdep用来记录当前已求出的那些子表的最大深度,stack1和stack2共用一个栈顶指针*/ int stack2[M],depth=0,maxdep=0,top=-1; p=list->pointer;/*
将p指针指向广义链表的第一个元素所在的链接点*/
if(p!=NULL){ do{ while(p!=NULL){ stack1[++top]=p;/*记录当前子表的起始位置*/
stack2[top]=depth;/*记录当前所求子表的深度*/ if(p->flag==1){ /*当前链接点元素是子表*/depth++;/*当前层次数加1*/ p=p->pointer;/*移动到下一层*/ } else p=NULL; } if(maxdep <depth){ maxdep=depth;/*记录当前已求得的最大层次数*/ } p=stackl[top];/*退回到上一层,移动到下一个元素,查看是否有子表*/depth=stack2[top--];p=p->link;}(p!=NULL&&top!=-1);} return maxdep+1; } //复制广义表BSLinkList copyBSList(BSLinkList 1ista){ BSLinkLiSt 1istb=NULL;if(1ista!=NULL){ 1istb=(BSLinkList)malloc(sizeof(BSNode)); 1istb->flag=1ista->flag;
if(1ista->flag==0) 1istb->data=lista->data; else listb->pointer=copyBSList(1ista->pointer); listb->link=copyBSList(1ista->1ink), } return 1istb; })
22.试写出连接两个顺序串以及判断两个顺序串是否相等的算法。
__________________________________________________________________________________________
正确答案:(正确答案:(1)连接两个顺序串的算法。
已知顺序串St1和St2,把St2连接到St1的末尾,得到一个新的顺序串St3。
算法名为Concat_St(),参数为St1、St2。
Concat st(St1,St2) { char
St3[maxsize];/*创建一个新的顺序串为空*/ St3_1en=0, if(St1_1en+St2_1en>maxsize+1) /*新串放不下两个串*/{ printf(''两串长度之和超长!'');return(NULL);} else { for(i=n i<=St1_1en;i++) /*把串St1传送给串St3*/ St3[i]=St1 [i]; for(j=1; j<=St2_1en;j++) /*接着把St2传送给串St3*/ St3[j+St1_1en]=St2[j]; St3_Len=St1_1en+St2_1en;/*修改串St3的长度*/
St3[St3_1en+1]=''\0'';/*为St3安放串结束符*/ return(St3);/*返回St3*/ } } (2)判断两
个顺序串是否相等的算法。
已知顺序串St1和St2,如果相等则返回1,否则返回0。
算法名为Equal_St(),参数为St1、St2。
Equa1_St(St1,St2) { if(St1_1en!=St2_1en) /*两个串长度不相等*/ return(0);else /*两个串长度相等*/ { for(i=1;i<=St1_1en;i++) if(St1[i]!=St2[i]) /*有字符不同*/return(0), return(1); } } (2)判断两个顺序串是否相等的算法。
已知顺序串St1和St2,如果相等
则返回1,否则返回0。
算法名为Equal_St(),参数为St1、St2。
)。