目录

第4章  串、数组和广义表

1.选择题

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

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

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

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

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

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

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

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

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

(10)A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是(  )。

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

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

(13)广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为(  )。

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

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

二、应用题

(1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。

(2)设目标为t=“abcaabbabcabaacbacba”,模式为p=“abcabaa”

(3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求:

(4)请将香蕉banana用工具 H( )—Head( ),T( )—Tail( )从L中取出。

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

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

(7)编写算法,实现下面函数的功能。函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。

(8)已知字符串S1中存放一段英文,写出算法format(s1,s2,s3,n),将其按给定的长度n格式化成两端对齐的字符串S2, 其多余的字符送S3。

(9)设二维数组a[1..m, 1..n] 含有m*n 个整数。

(10)设任意n个整数存放于数组A(1:n)中,试编写算法,将所有正数排在所有负数前面(要求算法复杂性为0(n))。

第4章  串、数组和广义表

1.选择题

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

A.可以顺序存储               B.数据元素是一个字符

C.可以链式存储               D.数据元素可以是多个字符若

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

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

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

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

A.012345678999   B.012121111212   C.011234223456    D.0123012322345

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

A.010104101      B.010102101      C.010100011       D.010101011

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

A.串中所含不同字母的个数       B.串中所含字符的个数

C.串中所含不同字符的个数       D.串中所含非空格字符的个数

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

A.808            B.818             C.1010             D.1020

(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

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

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

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

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

(10)A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是(  )。

A.i(i-1)/2+j       B.j(j-1)/2+i       C.i(j-i)/2+1       D.j(i-1)/2+1

(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

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

A.55            B.45             C.36            D.16

(13)广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为(  )。

A.(g)            B.(d)             C.c            D.d

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

A.a              B.( )             C.(a,b,c,d)      D.(b,c,d)

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

A.1和1          B.1和3          C.1和2          D.2和3

二、应用题

(1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。

模式串t的next和nextval值如下:

j

1  2  3  4  5  6  7  8  9  10 11 12

t串

a  b  c  a  a  b  b  a  b   c  a  b

next[j]

0  1  1  1  2  2  3  1  2  3  4  5

nextval[j]

0  1  1  0  2  1  3  0  1  1  0  5

(2)设目标为t=“abcaabbabcabaacbacba”,模式为p=“abcabaa”

① 计算模式p的naxtval函数值;

② 不写出算法,只画出利用KMP算法进行模式匹配时每一趟的匹配过程。

① p的nextval函数值为0110132。(p的next函数值为0111232)。

② 利用KMP(改进的nextval)算法,每趟匹配过程如下:

第一趟匹配: abcaabbabcabaacbacba

abcab(i=5,j=5)

第二趟匹配: abcaabbabcabaacbacba

abc(i=7,j=3)

第三趟匹配: abcaabbabcabaacbacba

a(i=7,j=1)

第四趟匹配: abcaabbabcabaac bacba

(成功)             abcabaa(i=15,j=8)

(3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求:

① 存放该数组所需多少单元?

② 存放数组第4列所有元素至少需多少单元?

③ 数组按行存放时,元素A[7,4]的起始地址是多少?

④ 数组按列存放时,元素A[4,7]的起始地址是多少?

每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。

(1)242   (2)22   (3)s+182   (4)s+142

(4)请将香蕉banana用工具 H( )—Head( ),T( )—Tail( )从L中取出。

L=(apple,(orange,(strawberry,(banana)),peach),pear)

H(H(T(H(T(H(T(L)))))))

(5)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这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++)  // 输出数字字符的个数

printf(“数字%d的个数=%d\n”,i,num[i]);

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

printf(“字母字符%c的个数=%d\n”,i+55,num[i]);

}// 算法结束。

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

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

void InvertStore(char A[])

//字符串逆序存储的递归算法。

{ char ch;

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

scanf ("%c",&ch);

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

{InvertStore(A);

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

}

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

}//结束算法InvertStore。

(7)编写算法,实现下面函数的功能。函数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) {printf(“pos参数位置非法\n”);exit(0);}

while(*p!=’\0’&&i<pos) {p++;i++;} //查pos位置

//若pos小于串s长度,则查到pos位置时,i=pos。

if(*p == '/0') {printf("%d位置大于字符串s的长度",pos);exit(0);}

else      //查找字符串的尾

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中。

(8)已知字符串S1中存放一段英文,写出算法format(s1,s2,s3,n),将其按给定的长度n格式化成两端对齐的字符串S2, 其多余的字符送S3。

[题目分析]本题要求字符串s1拆分成字符串s2和字符串s3,要求字符串s2“按给定长度n格式化成两端对齐的字符串”,即长度为n且首尾字符不得为空格字符。算法从左到右扫描字符串s1,找到第一个非空格字符,计数到n,第n个拷入字符串s2的字符不得为空格,然后将余下字符复制到字符串s3中。

void format (char *s1,*s2,*s3)

//将字符串s1拆分成字符串s2和字符串s3,要求字符串s2是长n且两端对齐

{char *p=s1, *q=s2;

int i=0;

while(*p!= '\0' && *p== ' ') p++;//滤掉s1左端空格

if(*p== '\0') {printf("字符串s1为空串或空格串\n");exit(0); }

while( *p!='\0' && i<n){*q=*p; q++; p++; i++;}//字符串s1向字符串s2中复制

if(*p =='\0'){ printf("字符串s1没有%d个有效字符\n",n); exit(0);}

if(*(--q)==' ' ) //若最后一个字符为空格,则需向后找到第一个非空格字符

{p-- ;          //p指针也后退

while(*p==' '&&*p!='\0') p++;//往后查找一个非空格字符作串s2的尾字符

if(*p=='\0') {printf("s1串没有%d个两端对齐的字符串\n",n); exit(0); }

*q=*p;         //字符串s2最后一个非空字符

*(++q)='\0';   //置s2字符串结束标记

}

*q=s3;p++;      //将s1串其余部分送字符串s3。

while (*p!= '\0') {*q=*p; q++; p++;}

*q='\0';        //置串s3结束标记

}

(9)设二维数组a[1..m, 1..n] 含有m*n 个整数。

① 写一个算法判断a中所有元素是否互不相同?输出相关信息(yes/no);

② 试分析算法的时间复杂度。

[题目分析]判断二维数组中元素是否互不相同,只有逐个比较,找到一对相等的元素,就可结论为不是互不相同。如何达到每个元素同其它元素比较一次且只一次?在当前行,每个元素要同本行后面的元素比较一次(下面第一个循环控制变量p的for循环),然后同第i+1行及以后各行元素比较一次,这就是循环控制变量k和p的二层for循环。

int JudgEqual(ing a[m][n],int m,n)

//判断二维数组中所有元素是否互不相同,如是,返回1;否则,返回0。

{for(i=0;i<m;i++)

for(j=0;j<n-1;j++)

{ for(p=j+1;p<n;p++) //和同行其它元素比较

if(a[i][j]==a[i][p]) {printf(“no”); return(0); }

//只要有一个相同的,就结论不是互不相同

for(k=i+1;k<m;k++)  //和第i+1行及以后元素比较

for(p=0;p<n;p++)

if(a[i][j]==a[k][p]) {printf(“no”); return(0); }

}// for(j=0;j<n-1;j++)

printf(yes”); return(1);   //元素互不相同

}//算法JudgEqual结束

  1. 二维数组中的每一个元素同其它元素都比较一次,数组中共m*n个元素,第1个元素同其它m*n-1个元素比较,第2个元素同其它m*n-2 个元素比较,……,第m*n-1个元素同最后一个元素(m*n)比较一次,所以在元素互不相等时总的比较次数为 (m*n-1)+(m*n-2)+…+2+1=(m*n)(m*n-1)/2。在有相同元素时,可能第一次比较就相同,也可能最后一次比较时相同,设在(m*n-1)个位置上均可能相同,这时的平均比较次数约为(m*n)(m*n-1)/4,总的时间复杂度是O(n4)。

(10)设任意n个整数存放于数组A(1:n)中,试编写算法,将所有正数排在所有负数前面(要求算法复杂性为0(n))。

[题目分析]本题属于排序问题,只是排出正负,不排出大小。可在数组首尾设两个指针i和j,i自小至大搜索到负数停止,j自大至小搜索到正数停止。然后i和j所指数据交换,继续以上过程,直到 i=j为止。

void Arrange(int A[],int n)

//n个整数存于数组A中,本算法将数组中所有正数排在所有负数的前面

{int i=0,j=n-1,x;  //用类C编写,数组下标从0开始

while(i<j)

{while(i<j && A[i]>0)  i++;

while(i<j && A[j]<0)  j--;

if(i<j) {x=A[i]; A[i++]=A[j]; A[j--]=x; }//交换A[i] 与A[j]

}

}//算法Arrange结束.

[算法讨论]对数组中元素各比较一次,比较次数为n。最佳情况(已排好,正数在前,负数在后)不发生交换,最差情况(负数均在正数前面)发生n/2次交换。用类c编写,数组界偶是0..n-1。空间复杂度为O(1)。

数据结构(C语言第2版) 课后习题答案之第四章 串、数组和广义表相关推荐

  1. 数据结构(C语言第2版) 课后习题答案之 第六章 图

    目录 第六章 图 1.选择题 2.应用题 (1)已知如下图所示的有向图,请给出: (2)已知如图6.28所示的无向网,请给出:          ​ (3)已知图的邻接矩阵如6.29所示.试分别画出自 ...

  2. 数据结构(C语言第2版) 课后习题答案之第五章 树和二叉树

    目录 第5章  树和二叉树 一.选择题 二.应用题 (1)试找出满足下列条件的二叉树 (2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C (3 ...

  3. 《明解C语言》笔记及课后习题答案 【第四章】

    练习4-1 /*---改写判断整数型符号的程序,使其可以重复输入和输出---*/ #include <stdio.h>int main(void) {int a, retry;do {pr ...

  4. 谢希仁计算机网络第五版课后习题答案(1~6章)

    计算机网络课后习题答案 第一章   概述 1 第二章   物理层 4 第三章   数据链路层 7 第四章   网络层 11 第五章   传输层 19 第六章   应用层 24 第一章   概述 1-0 ...

  5. 计算机系统概论(原书第2版)部分课后习题答案(第四章)

    小编在学计系1的时候,一直找不到中文版的答案,英文版的答案又要钱才能下载,而且这个书翻译的真的牛(cai)逼--有的题目有歧义或者直接翻译有问题,有的直接把题目搞错的,思考很久都没有结果--然后又要去 ...

  6. 《明解C语言》笔记及课后习题答案 【第十一章】

    练习11-1 /*---将代码清单进行修改---*/#include <stdio.h>int main(void) {char *p = "123";printf(& ...

  7. 材料力学c语言程序,材料力学(I)五版课后习题答案完整版.pdf

    材料力学(I)五版课后习题答案完整版 第二章 轴向拉伸和压缩 第二章 轴向拉伸和压缩 第第二二章章 轴轴向向拉拉伸伸和和压压缩缩 2-1 试求图示各杆1-1和2-2横截面上的轴力,并作轴力图. 解 解 ...

  8. 朱善利《微观经济学》第3版课后习题答案

    完整版在线阅读>>> http://wwxx.100xuexi.com/Ebook/4459.html 本书是朱善利<微观经济学>(第3版)教材的学习辅导书,对朱善利&l ...

  9. 计算机操作系统英文版课后答案,计算机操作系统(第3版)课后习题答案(完整版)...

    内容简介: 计算机操作系统(第3版)课后习题答案(完整版) 第一章 1.设计现代OS的主要目标是什么? 答:(1)有效性 (2)方便性 (3)可扩充性 (4)开放性 2.OS的作用可表现在哪几个方面? ...

最新文章

  1. 对冒泡和二分法,特别是二分法有了更深的理解
  2. 英文论文中i.e.,e.g.,etc.的正确用法
  3. 通过查看__cplusplus的值查看编译器的C++标准
  4. LTDC/DMA2D—液晶显示
  5. 前端学习(3161):react-hello-react之样式的模块化
  6. ZJOI2008皇帝的烦恼
  7. 基于主机Overlay和自研虚拟化网关的VPC在360的落地
  8. BitTorrent协议与MagNet协议原理
  9. virtualenv 的使用 —— PyCharm 与 Jupyter Notebook
  10. 应届生还是研究生?与大学生的MSN谈话二
  11. 电子技术专业基础与实务(中级)考试经验
  12. 什么是通配符 计算机网络,通配符
  13. java实现二维码生成功能
  14. Android MultiDex 源码分析
  15. 什么样的广告形式收益高?App商业化变现广告位设计的4大原则及5类广告位优化思路
  16. AspectJ使用实例
  17. eclipse使用maven插件(m2e)配置及运行web项目
  18. 2013年版《史上最全的桌面级CPU天梯图》
  19. 基于Java的高校网上报销平台系统详细设计基于Java的高校网上报销平台系统详细设计
  20. Aptina荣获2010年EDN创新奖

热门文章

  1. 我家厨房--冬阴功汤和青椒炒腊肠
  2. Premiere视频调色处理,将彩色画面转变成黑白色 myblogfree
  3. 组件Element的入门学习
  4. 两台华为交换机组网互通方法
  5. cocos2d-x的面试题
  6. IDEA Java程序启动添加参数 VM options、Program arguments、Program arguments
  7. 一个方便查找SCI的爬虫软件
  8. 当渠道需要在Application中调用有参方法
  9. MDK编译全过程及数据存储
  10. Echarts3实例 双Y轴柱状图