第 4 章数据结构习题题目及答案 串
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、基础知识题
4.1 简述下列每对术语的区别:
空串和空格串;串常量与串变量;主串和子串;串变量的名字和串变量的值;静态分配的顺序串与动态分配的顺序串。
【解答】不含任何字符的串称为空串,其长度为0。仅含有空格字符的串称为空格串,其长度为串中空格字符的个数。空格符可用来分割一般的字符,便于人们识别和阅读,但计算串长时应包括这些空格符。空串在串处理中可作为任意串的子串。
用引号(数据结构教学中通常用单引号,而C语言中用双引号)括起来的字符序列称为串常量,其串值是常量。串值可以变化的量称为串变量。
串中任意个连续的字符组成的子序列被称为该串的子串。包含子串的串又被称为该子串的主串。子串在主串中第一次出现时的第一个字符的位置称子串在主串中的位置。
串变量与其它变量一样,要用名字引用其值,串变量的名字也是标识符,串变量的值可以修改。
串的存储也有静态存储和动态存储两种。静态存储指用一维数组,通常一个字符占用一个字节,需要静态定义串的长度,具有顺序存储结构的优缺点。若需要在程序执行过程中,动态地改变串的长度,则可以利用标准函数malloc()和free()动态地分配或释放存储单元,提高存储资源的利用率。在C语言中,动态分配和回收的存储单元都来自于一个被称之为“堆”的自由存储区,故该方法可称为堆分配存储。类型定义如下所示:
typedef struct
{ char *str;
int length;
}HString;
4.2设有串S=’good’,T=’I︼am︼a︼student’,R=’!’,求:
(1)StringConcat(T,R) (2)SubString(T,8,7)
(3)StringLength(T) (4)Index(T,’a’)
(5)StringInsert(T,8,S)
(6)Replace(T,SubString(T,8,7),’teacher’)
【解答】
(1) StringConcat(T,R)=’I︼am︼a︼student!’
(2) SubString(T,8,7)=’student’
(3) StringLength(T)=14
(4) Index(T,’a’)=3
(5) StringInsert(T,8,S)=’I︼am︼a︼goodstudent’
(6) Replace(T, SubString(T,8,7),’teacher’)= ’I︼am︼a︼teacher’
4.3若串S1=‘ABCDEFG’,S2=‘9898’ ,S3=‘###’,S4=‘’,执行
concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2)))
操作的结果是什么?
【解答】
concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,
index(S2,‘8’),length(S2)))
= concat(replace(S1,substr(S1,4,3),S3),substr(S4,2,4))
= concat(replace(S1,’DEF’,S3),’1234’)
↓i=1
第一趟匹配:a a b c b a b c a a b c a a b a b
↑j=1
↓i=2
第二趟匹配: a b a b c a b c a c b a b
b c
↑j=2
↓i=3
第三趟匹配: a b a b c a b c a c b a b
b
↑j=1
↓i=7
第四趟匹配: a b a b c a b c a c b a b
b c a (匹配成功)
↑j=4
4.9选择题:下面关于串的的叙述中,哪一个是不正确的?
A.串是字符的有限序列
B.空串是由空格构成的串
C.模式匹配是串的一种重要运算
D.串既可以采用顺序存储,也可以采用链式存储
【解答】 B
4.10选择题:串是一种特殊的线性表,下面哪个叙述体现了这种特殊性?
A.数据元素是一个字符 B. 可以顺序存储
C. 数据元素可以是多个字符
D. 可以链接存储
【解答】A
二、算法设计题
4.11试写出用单链表表示的字符串结点类型的定义,并依次实现它的计算串长度、串赋值、判断两串
相等、求子串、两串连接、求子串在串中位置的6个函数。要求每个字符串结点中只存放一个字符。
【算法4.11】
单链表结点的类型定义如下:
typedef struct Node
{char data;
struct Node *next;
}LNode,*LinkedString;
(1) 计算串长度
int StringLength(LinkedString L)
{∥求带头结点的用单链表表示的字符串的长度
p=L->next; ∥p指向串中第一个字符结点j=0; ∥计数器初始化
while(p)
{j++; p=p->next;} ∥计数器加1,指针后移return j;
}
(2) 串赋值
LinkedString StringAssign(LinkedString L)
{//将字符串L的值赋给串s
LNode *s,*p,*r;
s=(char *)malloc(sizeof(char));
s->next=null; //头结点
r=s; //r记住尾结点
L=L->next; //串中第一字符
while(L)
{p=(char *)malloc(sizeof(char));
p->data=L->data; //赋值
p->next=r->next; //插入链表中
r->next=p;
r=p; //指向新的尾结点
L=L->next;
}
return s;
}
(3) 判断两串相等
int StringEqual(LinkedString s, LinkedString q) {//判断字符串的相等
LNode *p=s->next,*r=q->next;
while(p && r)
if(p->data==r->data)
{p=p->next; r=r->next;}
else return 0;
if(!p && !r)
return 1;
else
return 0;
}
(4) 求子串