数据结构答案串学习指导Word文档下载推荐.docx
《数据结构答案串学习指导Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构答案串学习指导Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
〔1〕求串长:
LenStr(s)。
〔2〕串连接:
ConcatStr(s1,s2)。
〔3〕求子串:
SubStr(s,i,len)。
〔4〕串比较:
EqualStr(s1,s2)。
〔5〕子串查找:
IndexStr(s,t),找子串t在主串s中首次出现的位置〔也称形式匹配〕。
〔6〕串插入:
InsStr(s,t,i)。
〔7〕串删除:
DelStr(s,i,len)。
4.串的存储
〔1〕定长顺序存储。
〔2〕链接存储。
〔3〕串的堆分配存储。
典型习题分析
【例1】下面关于串的的表达中,哪一个是不正确的?
〔 〕
A.串是字符的有限序列B.空串是由空格构成的串
C.形式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储
分析:
空串是不含任何字符的串,即空串的长度是零。
空格串是由空格组成的串,其长度等于空格的个数。
答案为B。
【例2】两个串相等的充分必要条件是()。
A.两个串长度相等B.两个串有一样字符
C.两个串长度相等且有一样字符D.以上结论均不正确
根据串相等定义,两个串是相等是指两个串的长度相等且对应字符都相等,故A、B、C均不正确,答案为D。
【例3】串链式存储的优点是〔1〕,缺点是〔2〕。
由链式存储结点特点可以得到:
〔1〕插入、删除方便。
〔2〕浪费空间。
注意,这里串的链式存储是指结点元素为1个字符的链串,假设结点元素字符数大于1,插入和删除同样不方便,但空间利用率可以进步。
【例4】设S="
abccdcdccbaa"
,T="
dccb"
,那么第7次匹配成功。
由字符串形式匹配概念,匹配过程如下:
S="
第一趟 d 不成功
第二趟 d不成功
第三趟 d不成功
S="
第四趟 d不成功
第五趟 dcc不成功
第六趟 d不成功
第七趟 dccb成功
【例5】利用函数LenStr(s),SubStr(s,i,len)和ConcatStr(s1,s2)写一算法voidStrInsert(char*S,char*T,inti),将串T插入到串S的第i个位置上。
假设i大于S的长度,那么插入不执行。
请在处填写语句,完成此程序。
算法如下:
voidInsStr(char*S,char*T,inti)//将串T插入到串S的第i个位置上
{
char*Temp;
Temp=(char*)malloc(sizeof(char[Maxsize]));
//设置一个临时串
if(i<
=LenStr(S))
{
(1);
//将第i位起以后的字符拷贝到临时串中
S=
(2);
//将串T拷贝到串S的第i个位置处,覆盖后面的字符
S=(3);
//把临时串中的字符联接到串S后面
free(Temp);
}
〔1〕因为是将串S第i个位置起以后字符复制到临时串变量Temp中采用求子串方法即Temp=SubStr(s,i,LenStr(S))。
〔2〕因为将串T拷贝到串S的第i个位置处,覆盖后面的字符采用串连接方法,即ConcatStr(SubStr(S,0,i-1),T)。
〔3〕ConcatStr(SubStr(S,0,i-1),Temp)。
【例6】链式串上的子串定位。
由于是链式串,所以对元素的存储表示与顺序存储串不同,在链式串中不是用下标指示元素,而是用指针指向元素。
程序如下:
typedefstructnode
{chardata;
structnode*next;
}LinkStrNode;
LinkStr*LinkStrNode(LinkStrNode*t,LinkStrNode*p)
{LinkStrNode*pos,*qi,*qj;
pos=t;
qi=pos;
qj=p;
while(qi&
&
qj)
{if(q1->
data==qj->
data)
{qi=qi->
next;
qj=qj->
else
{pos=pos->
//形式右移,继续判断pos是否为有校位移
qi=pos;
qj=p;
}
if(qj==NULL)
returnpos;
//匹配成功
else
returnNULL;
//匹配失败
【例7】一个文本串可用事先给定的字母映射表进展加密,例如,设字母映射表为:
abcdefghijklmnopqrstuvwxyz
ngzqtcobmuhelkpbawxfyIvrsj
那么字符串“encrypt〞被加密为“tkzwsdf〞。
试写一算法将输入的文本串进展加密后输出;
另写一算法,将输入的加密文本串进展加密后输出。
typedefstruct
{charch[2];
[MaxStrSize];
intlength;
}SeqString;
voidEncoding(char*s,seqStringT)
{inti,j;
intm=T.length;
//字母表长
intn=strlen(S);
//求文本的长度
for(i=0;
i<
n;
i++)
{for(j=0;
j<
m;
j++)
if(S[i]==T.ch[0][j])
{printf("
%c"
T.ch[1][j]);
break;
if(j==m)
printf("
%cisnotinalphabet"
S[i]);
}
voidDeCoding(char*S,seqStringT)//串S是待解密的文本
for(i=0;
if(S[i]==T.ch[1][j])
T.ch[0][j]);
if(j==m)
printf("
【例8】假设S和T是用结点大小为1的单链表存储的两个串,试设计一个算法找出S中第一个不在T中出现的字符。
查找过程是这样的,取S中的一个字符(结点),然后和T中所有的字符一一比较,直到比完仍没有一样的字符时,查找过程完毕,否那么再取S中下一个字符,重新进展上述过程。
typedefstructnode
charSearchNo(LinkStrNode*S,LinkStrNode*T)//查找不在T中出现的字符
LinkStrNode*p,*q;
p=S;
q=T;
while(p)//取S中结点字符
{while(q&
p->
data!
=q->
data)//进展字符比较
q=q->
if(q==NULL)
returnp->
data;
//找到并返回字符值
q=T;
//指针恢复串T的开始结点
p=p->
}
printf("
there'
snosuchcharacter."
);
returnNULL;
5.3单元练习5解答
一.判断题答案
题目
1
2
3
4
5
6
7
8
9
10
答案
×
√
二.填空题答案
(1)字符串〔或串〕
(2)堆分配存储
(3)顺序串
(4)空间利用率低
(5)效率低
(6)空间利用率低
(7)\0
(8)空格的个数
(9)空格串
(10)字符都一样
(11)8
(12)Todayis30July,2005
(13)July
(14)<
0
(15)0
(16)形式
(17)有效位移
(18)6
(19)0
(20)(n-m+1)*m
三.选择题答案
B
C
A
D
11
12
13
14
15
16
17
18
19
20
四.程序题填空答案
〔1〕①MAXLEN
②r2->
len
③r1->
len+i
④'
\0'
⑤r1->
len+r2->
len
〔2〕①〕!
=或<
>
②&
③!
=
④tag=0
⑤i++
〔3〕①s->
②s->
len
③k
④ \0
⑤ i-1
五.编程题答案
〔1〕①分析:
从头至尾扫描r串,对于值为ch1的元素直接交换成ch2即可。
【程序代码】
str*trans(str*r,charch1,charch2)
{inti;
for(i=0;
r->
len;
if(r->
vec[i]==ch1)
r-vec[i]=ch2;
return(r);
}
2分析:
将第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,依次类推,便将该串的所有字符反序了。
str*invert(str*r)
charx;
(r->
len%2);
{x=r->
vec[i