好文档 - 专业文书写作范文服务资料分享网站

数据结构(C语言版)第2版习题答案—严蔚敏(简化版)

天下 分享 时间: 加入收藏 我要投稿 点赞

第4章 串、数组和广义表

1.选择题

(1)串是一种特殊的线性表,其特殊性体现在( )。

A.可以顺序存储 B.数据元素是一个字符 C.可以链式存储 D.数据元素可以是多个字符若 答案:B

(2)串下面关于串的的叙述中,( )是不正确的?

A.串是字符的有限序列 B.空串是由空格构成的串

C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储 答案:B

解释:空格常常是串的字符集合中的一个元素,有一个或多个空格组成的串成为空格

串,零个字符的串成为空串,其长度为零。

(3)串“ababaaababaa”的next数组为( )。

A.012345678999 B.012121111212 C.011234223456 D.0123012322345 答案:C

(4)串“ababaabab”的nextval为( )。

A.010104101 B.010102101 C.010100011 D.010101011 答案:A

(5)串的长度是指( )。

A.串中所含不同字母的个数 B.串中所含字符的个数 C.串中所含不同字符的个数 D.串中所含非空格字符的个数 答案:B

解释:串中字符的数目称为串的长度。

(6)假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( )。

A.808 B.818 C.1010 D.1020 答案:B

解释:以行序为主,则LOC[5,5]=[(5-1)*100+(5-1)]*2+10=818。

(7)设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。

A.BA+141 B.BA+180 C.BA+222 D.BA+225 答案:B

解释:以列序为主,则LOC[5,8]=[(8-1)*8+(5-1)]*3+BA=BA+180。

(8)设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为( )。

A.13 B.32 C.33 D.40

11

答案:C

(9)若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(i

A.i*(i-1)/2+j B.j*(j-1)/2+i C.i*(i+1)/2+j D.j*(j+1)/2+i 答案:B

(10)二维数组A的每个元素是由10个字符组成的串,其行下标i=0,1,…,8,列下标

j=1,2,…,10。若A按行先存储,元素A[8,5]的起始地址与当A按列先存储时的元素( )的起始地址相同。设每个字符占一个字节。

A.A[8,5] B.A[3,10] C. A[5,8] D.A[0,9] 答案:B

解释:设数组从内存首地址M开始顺序存放,若数组按行先存储,元素A[8,5]的起

始地址为:M+[(8-0)*10+(5-1)]*1=M+84;若数组按列先存储,易计算出元素A[3,10]的起始地址为:M+[(10-1)*9+(3-0)]*1=M+84。故选B。

(11)设二维数组A[1.. m,1.. n](即m行n列)按行存储在数组B[1.. m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为( )。

A.(i-1)*n+j B.(i-1)*n+j-1 C.i*(j-1) D.j*m+i-1

答案:A

解释:特殊值法。取i=j=1,易知A[1,1]的的下标为1,四个选项中仅有A选项能

确定的值为1,故选A。

(12)数组A[0..4,-1..-3,5..7]中含有元素的个数( )。

A.55 B.45 C.36 D.16 答案:B

解释:共有5*3*3=45个元素。

(13)广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为( )。 A.(g) B.(d) C.c D.d 答案:D

解释:Tail(A)=(b,(c,d),(e,(f,g)));Tail(Tail(A))=( (c,d),(e,(f,g))); Head(Tail(Tail(A)))=

(c,d);Tail(Head(Tail(Tail(A))))=(d);Head(Tail(Head(Tail(Tail(A)))))=d。

(14)广义表((a,b,c,d))的表头是( ),表尾是( )。

A.a B.( ) C.(a,b,c,d) D.(b,c,d) 答案:C、B

解释:表头为非空广义表的第一个元素,可以是一个单原子,也可以是一个子表,

((a,b,c,d))的表头为一个子表(a,b,c,d);表尾为除去表头之外,由其余元素构成的表,表为一定是个广义表,((a,b,c,d))的表尾为空表( )。

(15)设广义表L=((a,b,c)),则L的长度和深度分别为( )。

A.1和1 B.1和3 C.1和2 D.2和3 答案:C

解释:广义表的深度是指广义表中展开后所含括号的层数,广义表的长度是指广义表

12

中所含元素的个数。根据定义易知L的长度为1,深度为2。

2.应用题

(4)请将香蕉banana用工具 H( )—Head( ),T( )—Tail( )从L中取出。 L=(apple,(orange,(strawberry,(banana)),peach),pear) 答案:H(H(T(H(T(H(T(L)))))))

3.算法设计题

(1)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。

[题目分析] 由于字母共26个,加上数字符号10个共36个,所以设一长36的整型数组,前10个分量存放数字字符出现的次数,余下存放字母出现的次数。从字符串中读出数字字符时,字符的ASCII代码值减去数字字符 ‘0’的ASCII代码值,得出其数值(0..9),字母的ASCII代码值减去字符‘A’的ASCII代码值加上10,存入其数组的对应下标分量中。遇其它符号不作处理,直至输入字符串结束。

[算法描述] void Count()

//统计输入字符串中数字字符和字母字符的个数。 {int i,num[36]; char ch;

for(i=0;i<36;i++)num[i]=0;// 初始化

while((ch=getchar())!=‘#’) //‘#’表示输入字符串结束。 if(‘0’<=ch<=‘9’){i=ch-48;num[i]++;} // 数字字符 else if(‘A’<=ch<=‘Z’){i=ch-65+10;num[i]++;}// 字母字符 for(i=0;i<10;i++) // 输出数字字符的个数

(2)写一个递归算法来实现字符串逆序存储,要求不另设串存储空间。

[题目分析]实现字符串的逆置并不难,但本题“要求不另设串存储空间”来实现字符串逆序存储,即第一个输入的字符最后存储,最后输入的字符先存储,使用递归可容易做到。

[算法描述]

void InvertStore(char A[]) //字符串逆序存储的递归算法。 {char ch;

static int i = 0;//需要使用静态变量

13

cout<<“数字”<

for(i=10;i<36;i++)// 求出字母字符的个数

cin>>ch;

if (ch!= '.') //规定'.'是字符串输入结束标志 }

(3)编写算法,实现下面函数的功能。函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)

[题目分析]本题是字符串的插入问题,要求在字符串s的pos位置,插入字符串t。首先应查找字符串s的pos位置,将第pos个字符到字符串s尾的子串向后移动字符串t的长度,然后将字符串t复制到字符串s的第pos位置后。

对插入位置pos要验证其合法性,小于1或大于串s的长度均为非法,因题目假设给字符串s的空间足够大,故对插入不必判溢出。

[算法描述]

void insert(char *s,char *t,int pos) //将字符串t插入字符串s的第pos个位置。

{int i=1,x=0; char *p=s,*q=t; //p,q分别为字符串s和t的工作指针 if(pos<1) {cout<<“pos参数位置非法”<

if(*p == '/0') { cout<

while(*p!= '/0') {p++; i++;} //查到尾时,i为字符‘\\0’的下标,p也指向‘\\0’。 while(*q!= '\\0') {q++; x++; } //查找字符串t的长度x,循环结束时q指向'\\0'。 for(j=i;j>=pos ;j--){*(p+x)=*p; p--;}//串s的pos后的子串右移,空出串t的位置。

q--; //指针q回退到串t的最后一个字符

for(j=1;j<=x;j++) *p--=*q--; //将t串插入到s的pos位置上

[算法讨论] 串s的结束标记('\\0')也后移了,而串t的结尾标记不应插入到s中。 (

{InvertStore(A);

A[i++] = ch;//字符串逆序存储 }

A[i] = '\\0'; //字符串结尾标记

14

第5章 树和二叉树

1.选择题

(1)把一棵树转换为二叉树后,这棵二叉树的形态是( )。 A.唯一的 B.有多种

C.有多种,但根结点都没有左孩子 D.有多种,但根结点都没有右孩子 答案:A

解释:因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的

形态是唯一的。

(2)由3个结点可以构造出多少种不同的二叉树?( ) A.2 B.3 C.4 D.5 答案:D

解释:五种情况如下:

AABCABABABB

C

C

C

C (3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是( )。 A.250 B. 500 C.254 D.501 答案:D

解释:设度为0结点(叶子结点)个数为A,度为1的结点个数为B,度为2的结点个数为C,有A=C+1,A+B+C=1001,可得2C+B=1000,由完全二叉树的性质可得B=0或1,又因为C为整数,所以B=0,C=500,A=501,即有501个叶子结点。

(4)一个具有1025个结点的二叉树的高h为( )。

A.11 B.10 C.11至1025之间 D.10至1024之间 答案:C

解释:若每层仅有一个结点,则树高h为1025;且其最小树高为 ?log21025? + 1=11,即h在11至1025之间。

(5)深度为h的满m叉树的第k层有( )个结点。(1=

k-1

B.m-1 C.m D.m-1

h

k-1

kh-1h

答案:A

解释:深度为h的满m叉树共有m-1个结点,第k层有m(6)利用二叉链表存储树,则根结点的右指针是( )。

A.指向最左孩子 B.指向最右孩子 C.空 D.非空 答案:C

解释:利用二叉链表存储树时,右指针指向兄弟结点,因为根节点没有兄弟结点,故根节点的右指针指向空。

(7)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的

15

个结点。

数据结构(C语言版)第2版习题答案—严蔚敏(简化版)

第4章串、数组和广义表1.选择题(1)串是一种特殊的线性表,其特殊性体现在()。A.可以顺序存储B.数据元素是一个字符C.可以链式存储D.数据元素可以是多个字符若答案:B(2)串下面关于串的的叙述中,()是不正确的?
推荐度:
点击下载文档文档为doc格式
3v42d99xjh2wkqq4mj6h371qz5d0jm00klt
领取福利

微信扫码领取福利

微信扫码分享