数据结构单元练习5Word格式.docx

上传人:b****5 文档编号:20836940 上传时间:2023-01-25 格式:DOCX 页数:14 大小:20.81KB
下载 相关 举报
数据结构单元练习5Word格式.docx_第1页
第1页 / 共14页
数据结构单元练习5Word格式.docx_第2页
第2页 / 共14页
数据结构单元练习5Word格式.docx_第3页
第3页 / 共14页
数据结构单元练习5Word格式.docx_第4页
第4页 / 共14页
数据结构单元练习5Word格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构单元练习5Word格式.docx

《数据结构单元练习5Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构单元练习5Word格式.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构单元练习5Word格式.docx

cdcc"

,则第6次匹配成功。

(19)设S="

c:

/mydocument/text1.doc"

,T="

mydont"

,则字符定位的位置为0。

(20)若n为主串长度,m为子串长度,且n>

>

m,则模式匹配算法最坏情况下的时间复杂度为:

(n-m+1)*m。

三.选择题

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

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

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

(2)某串的长度小于一个常数,则采用(B)存储方式最节省空间。

A.链式B.顺序C.堆结构D.无法确定

(3)以下论述正确的是(C)。

A.空串与空格串是相同的B."

tel"

是"

Teleptone"

的子串

C.空串是零个字符的串D.空串的长度等于1

(4)以下论述正确的是(B)。

ton"

C.空格串是有空格的串D.空串的长度等于1

(5)以下论断正确的是(A)。

A."

"

是空串,"

"

空格串B."

BEIJING"

BEIJING"

C."

something"

<

Somethig"

D."

BIT"

="

BITE"

(6)设有两个串S1和S2,则EqualStr(S1,S2)运算称作(D)。

A.串连接B.模式匹配

C.求子串D.串比较

(7)串的模式匹配是指(D)。

A.判断两个串是否相等C.找某字符在主串中第一次出现的位置

B.对两个串比较大小D.找某子串在主串中第一次出现的第一个字符位置

(8)若字符串"

ABCDEFG"

采用链式存储,假设每个字符占用1个字节,每个指针占用2个字节。

则该字符串的存储密度为(D)。

A.20%B.40%C.50%D.33.3%

(9)若字符串"

采用链式存储,假设每个指针占用2个字节,若希望存储密度50%,则每个结点应存储(A)个字符。

A.2B.3C.4D.5

(10)设串S1="

IAM"

ASDUDENT"

则ConcatStr(S1,S2)=(B)。

B."

IAMASDUDENT"

IAMASDUDENT"

D."

(11)设S="

,则LenStr(S)=(A)。

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

(12)设目标串T="

AABBCCDDE"

,模式P="

ABCDE"

,则该模式匹配的有效位移为(A)。

(13)设目标串T="

AABBCCDDEEFF"

CCD"

,则该模式匹配的有效位移为(D)。

A.2B.3C.4D.5

(14)设目标串T="

aabaababaabaa"

abab"

朴素匹配算法的外层循环进行了(D)次。

A.1B.9C.4D.5

(15)朴素模式匹配算法在最坏情况下的时间复杂度是(D)。

A.O(m)B.O(n)C.0(m+n)D.0(m*n)

(16)S="

morning"

,执行求子串函数SubStr(S,2,2)后的结果为(B)。

A."

mo"

B."

or"

C."

in"

D."

ng"

(17)S1="

good"

,执行串连接函数ConcatStr(S1,S2)后的结果为(A)。

goodmorning"

B."

goodmorning"

GOODMORNING"

D."

GOODMORNING"

(18)S1="

,执行函数SubStr(S2,4,LenStr(S1))后的结果为(B)。

B."

ning"

go"

morn"

(19)设串S1="

PQRST"

则ConcatStr(SubStr(S1,2,LenStr(S2)),SubStr(S1,LenStr(S2),2))的结果串为(D)。

A.BCDEFB.BCDEFGC.BCPQRSTD.BCDEFEF

(20)若串S="

SOFTWARE"

,其子串的数目最多是:

(C)。

A.35B.36C.37D.38

(8+7+6+5+4+3+2+1+1=37)

四.程序题填空(每空2分,共50分)

1.下面程序是把两个串r1和r2首尾相连的程序,即:

r1=r1+r2,试完成程序填空。

typedefStruct

{charvec[MAXLEN];

//定义合并后串的最大长度

intlen;

//len为串的长度

}St;

voidConcatStr(Str*r1,Str*r2)//字符串连接函数

{inti;

cout<

r1->

vec<

r2->

vec;

if(r1->

len+r2->

len>

MAXLEN)

cout<

两个串太长,溢出!

;

else

{for(i=0;

i<

r2->

len;

i++)//把r2连接到r1

r1->

vec[r1->

len+i]=r2->

vec[i];

vec[r1->

len+i]='

\0'

;

//添上字符串结束标记

len=r1->

//修改新串长度

}

}

2.设x和y两个串均采用顺序存储方式,下面的程序是比较x和y两个串是否相等的函数,试完成程序填空。

#defineMAXLEN100

typedefstruct

len;

}str;

intsame(x,y)

str*x,*y;

{inti=0,tag=1;

if(x->

len!

=y->

len)return(0);

//(或<

{while(i<

x->

len&

&

tag)

{if(x->

vec[i]!

vec[i])tag=0;

i++;

(或i=i+1)

return(tag);

3.下面算法是判断字符串是否为回文(即正读和倒读相同),试完成程序填空。

解:

#include"

stdio.h"

intlen;

}str;

voidPalindrome(strs)

{inti=0;

ingj=s.len-1;

while(j-i>

=1)

{if(s.vec[i]==s.vec[j])

{i++;

j--;

continue}//(或j=j+1)

else

break;

if(j-i>

cout<

Itisnotapalindrome\n"

Itisapalindrome\n"

五.编程题

1.设下面所用的串均采用顺序存储方式,其存储结构定义如下,请编写下列算法:

(1)将串中r中所有其值为ch1的字符换成ch2的字符。

(2)将串中r中所有字符按照相反的次序仍存放在r中。

(3)从串r中删除其值等于ch的所有字符。

(4)从串r1中第index个字符起求出首次与字符r2相同的子串的起始位置。

(5)从串r中删除所有与串r3相同的子串(允许调用第(4)小题的函数)。

(6)编写一个比较x和y两个串是否相等的函数。

2.设计一算法判断字符串是否为回文(即正读和倒读相同)

3.设计一算法从字符串中删除所有与字串"

del"

相同的子串

4.设计一算法统计字符串中否定词"

not"

的个数

1.解:

(1)算法思想:

从头至尾扫描r串,对于值为ch1的元素直接替换成ch2即可。

str*trans(r,ch1,ch2)

str*r;

charch1,ch2;

{inti;

for(i=0;

r->

len;

i++)

if(r->

vec[i]==ch1)

r-vec[i]=ch2;

return(r);

}

(2)算法思想是:

将第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,依次类推,便将该串的所有字符反序了。

str*invert(r)

charx;

(r->

len%2);

{x=r->

r->

vec[i]=r->

[r->

len-i+1];

vec[r->

len-i+1]=x;

return(r);

(3)算法思想:

从头到尾扫描r串,对于值为ch的元素用移动的方式进行删除。

str*delall(r,ch)

charch;

{inti,j;

for(i=0;

vec[i]==ch)

{

for(j=i;

j<

j++)

vec[i+1];

len=r->

len-1;

(4)算法思想:

从第index个元素开始扫描r1,当其元素值与r2的第一个元素的值相同时,判定它们之后的元素值是否依次相同,直到r2结束为止,若都相同则返回,否则继续上述过程直到r1扫描完为止。

intpartposition(r2,r1,index)

str*r2,*r1;

intindex;

{inti,j,k;

for(i=index;

r1->

for(j=i,k=0;

vec[j]==r2->

vec[k];

j++,k++)

if(!

vec[k+1])

return(i);

return(-1);

(5)算法思想:

从位置1开始调用第(4)小题的函数partposition(),若找到了一个相同子串,则调用delsubstring(),再相同的方法查找后面位置的相同子串。

str*delstringall(r,r3)

str*r,*r3;

{inti=0;

while(i<

len)

{if(partposition(r,r3,i)!

=-1)

delsubstring(r,i,r3->

i++;

(6)两个串相等的条件是两个串的长度相等,且两个串的对应的字符必须都相同。

intsame(x,y)

len!

=y->

len)

return(0);

{while(i<

tag)

{if(x->

vec[i]!

vec[i])

tag=0;

return(tag);

2.解:

#include"

{char*head;

intlength;

}Hstring;

voidisPalindrome(Hstrings)

{

inti=0;

intj=s.length-1;

while(j-i>

=1)

if(s.head[i]==s.head[j])

j--;

continue;

if(j-i>

printf("

Ttisnotapalindrome\n"

);

itisapalindrome\n"

3.解:

string.h"

}Hstring;

char*DeleteSubString(HstringS,HstringT)

inti=0;

intj,k;

intSlength=S.length;

intTlength=T.length;

char*tail;

=Slenght-Tlength)

j=0;

k=i;

while(j<

Tlength&

S.head[k]==T.head[j])//在位移i用朴素的模式匹配

{j++;

k++;

if(j==Tlength)//若匹配则执行下面的程序

if(i==0)//若位于头位置则改变头指针

S.head=S.head+Tlength;

S.length-=Tlength;

Slength-=Tlength;

i=0;

if(i+Tlength<

Slength)//若位于中间则拼接两端

tail=S.head+i+Tlength;

strcpy(S.head+i,tail);

else//若位于尾部则割去

strncpy(S.head+i,”\0”,1);

else//若不匹配则i加1

returnS.head;

4.解:

intFind_word(char*text,constchar*word)

inttextlength=strlen(text);

intwordlength=strlen(word);

inti,j,k;

intcount=0;

textlength-wordlength;

i++)

{j=0;

k=i;

wordlength&

text[k]==word[j])//朴素的模式匹配

{j++;

if(j==wordlength&

word[j]==’\0’)//匹配成功计数器加1

count++;

returncount;

模拟考题

1.下列程序是在字符串s的第i个字符起,连续删除长度为j的子串,试完成程序填空。

}str;

voidDelStr(Str*s,inti,intj)

{intk;

if(i+j-1>

s->

len)

\n\t\t所要删除的子串超界!

\n"

else

{for(k=i+j;

k<

k++,i++)

s->

vec[i]=s->

vec[k];

len=s->

len-j;

vec[s->

len]='

\0'

main()

{cout<

\n\t\t请输入从第几个字符开始:

cin>

i;

cout<

\n\t\t请输入删除的连续字符数:

j;

DelStr(s,i-1,j);

2.下列程序是在字符串s的第i个字符前,插入一个子串s1,试完成程序填空。

{charvec[MAXLEN];

Str*InsStr(Str*s,Str*s1,inti)

if(i>

=s->

len||s->

len+s1->

len>

MAXLEN)

\n\t\t不能插入!

{for(k=s->

k>

=i;

k--)

vec[s1->

len+k]=s->

for(k=0;

s1->

k++)

vec[i+k]=s1->

len=s->

returns;

main()

\n\t\t请输入在第几个字符前插入:

\n\t\t请输入所要插入的字符串:

s1=CseateStr(&

b);

InsStr(s,s1,i-1);

3.下列程序是在字符串s的第i个字符起,取出长度为j的子串,试完成程序填空。

voidSubStr(Str*s,inti,intj)

Stra;

Str*s1=&

a;

if(i+j-1>

{cout<

\n\t\t子串超界!

return;

{for(k=0;

k<

j;

s1->

vec[k]=s->

vec[i+k-1];

len=j;

vec[s1->

\n\t\t取出字符为:

puts(s1->

vec);

cin>

\n\t\t请输入取出的连续字符数:

SubStr(s,i,j);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1