数据结构肖启宏课后习题答案第五章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.名词解释
串:
串(string)是由零个或多个字符组成的有限序列。一般记为
S=“a1 a2...an”(n≥0)
其中,S是串名,用双引号或单引号括起来的字符序列是串的值,ai(1≤i≤n)称为串的元素,它可以是字母、数字、空格或其他字符。串中字符的个数n称为串的长度。
广义表:
广义表(Generalized Lists)是n (n≥0)个数据元素a1, a2,…,ai…,an的有序序列,一般记作:
ls= (a1,a2,…,ai,…,an)
其中:ls是广义表的名称,n是它的长度。每个ai(1≤i≤n)是ls的成员,它可以是单个元素,称为广义表ls的原子,也可以是一个广义表,称为广义表的子表。当广义表ls非空时,称第一个元素a1为ls的表头(head),称其余元素组成的表(a2,…,ai,…,an)为ls 的表尾( tail)。广义表的定义是递归的。
二.判断题(下列各题,正确的请在前面的括号内打√;错误的打ㄨ)
(1)ㄨ(2)√(3)ㄨ(4)ㄨ(5)√(6)√(7)ㄨ(8)√(9)ㄨ(10)√
三.填空题(10个)
1.长度
2.空串零
3.顺序存储
4.数据指针数据指针
5.模式匹配
6.顺序存储和链式存储
7.(a)(((b),c),(((d))))
8.广义表
四.选择题
1.B 2.D 3.B 4.C 5.C 6.A 7.B 8.A
五.简答题
1.简述串的存储结构及各自的特点。
串的存储方式有主要有顺序存储、堆分配存储和链式存储。
顺序结构:用一组地址连续的存储单元存储串的字符序列,构成串的顺序存储,简称为顺序
串。
特点:这种结构是按照预设大小,为每个定义的串变量分配一个固定长度的存储区。因此存在存储空间的越界或浪费的问题。对于操作如查找但是操作简单方便。
堆分配存储结构:在内存中开辟地址连续的存储空间作为串的可利用存储空间,称为堆空间,根据每个串的长度,动态地为每个串在堆空间里申请相应大小的存储区域的一种存储结构。特点:以一组地址连续的存储单元存放串的字符序列,但其存储空间是在算法执行过程中动态分配得到的,串也是顺序存储在所申请的存储区域中。由于堆分配存储结构的串既有顺序存储结构的特点,又没有造成对存储空间的浪费和对串长加以限制,使用非常灵活。
链式存储结构:是将存储区域分成一系列大小相同的结点,每个结点有两个域即数据域data 和指针域next。其中数据域用于存放字符串元素,指针域用于存放下一个结点的地址。
特点:在串中使用链式存储结构同样是在插入、删除等操作中没有移动元素所带来的时间耗费,存储空间的扩展容易;但结点的容量会带来存储空间的利用率降低。
2.广义表具有哪些性质?
(1) 广义表是一种多层次的数据结构。广义表的元素可以是原子,也可以是子表,而子表的元素还可以是子表。
(2) 广义表可以是递归的表。广义表的定义并没有限制元素的递归,即广义表也可以是其自身的子表。例如表E就是一个递归的表。
(3) 广义表可以为其他表所共享。例如D=(A, B, C)时,表A、B、C是表D的共享子表。在D中可以不必列出子表的值,而用子表的名称来引用。
六.下述算法的功能是什么
(1)实现串S和串T的连接运算。
(2)返回串S中从第n1个字符开始取n2个字符组成的子串。
七.程序设计题
1.写一个递归算法来实现字符的逆序存储,要求不另设存储空间。
#include "stdio.h"
#include MAXSIZE 80
char next[MAXSIZE80]; /*串的最大长度*/
void reverse ( int n) /*递归函数实现逆置*/
{
if(n<=1)
{
next[n]=getchar();
putchar(next[n]);
}
else
{
next[n]=getchar();
reverse (n-1);
putchar(next[n]);
}
}
main()
{
int i;
printf("请输入字符串长度值!\n");
scanf("%d",&i);getchar();
palin(i); /*调用逆置函数*/
printf("\n");
}
2.编写算法实现将串S中的第i个字符到第j个字符之间的字符(不包括第i个字符和第j 个字符)用串T替换。
#include
#define MAXSIZE 80
typedef struct
{
char ch[MAXSIZE];
int len;
}SEQSTRING;
SEQSTRING S,T,S1;
void replace(SEQSTRING S,int i,int j,SEQSTRING T) /*替换操作函数*/
{
SEQSTRING S1;
int h,k;
if(i {for(h=0;h S1.ch[h]=S.ch[h]; S1.len=i; h=0; while(h { S1.ch[S1.len+h]=T.ch[h]; h++; } S1.len=S1.len+T.len;