第四章串.docx

上传人:b****7 文档编号:11299322 上传时间:2023-02-26 格式:DOCX 页数:30 大小:20.01KB
下载 相关 举报
第四章串.docx_第1页
第1页 / 共30页
第四章串.docx_第2页
第2页 / 共30页
第四章串.docx_第3页
第3页 / 共30页
第四章串.docx_第4页
第4页 / 共30页
第四章串.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

第四章串.docx

《第四章串.docx》由会员分享,可在线阅读,更多相关《第四章串.docx(30页珍藏版)》请在冰豆网上搜索。

第四章串.docx

第四章串

#include

#defineMaxSize100//最多的字符个数

typedefstruct

{

chardata[MaxSize];//定义可以容纳MaxSize个字符的空间

intlength;//标记当前实际串长

}SqString;

voidStrAssign(SqString&str,charcstr[])//由串常量cstr创建str

{

inti;

for(i=0;cstr[i]!

='\0';i++)

str.data[i]=cstr[i];

str.length=i;

}

voidStrCopy(SqString&s,SqStringt)//将串t复制到串s

{

inti;

for(i=0;i

s.data[i]=t.data[i];

s.length=t.length;

}

intStrEqual(SqStrings,SqStringt)//判断两个串s和t是否相同

{

intsame=1,i;

if(s.length!

=t.length)//长度不相等时返回

same=0;

else

{

for(i=0;i

if(s.data[i]!

=t.data[i])//有一个对应字符不相同时返回

same=0;

}

returnsame;

}

intStrLength(SqStrings)//求串s的长度

{

returns.length;

}

SqStringConcat(SqStrings,SqStringt)//将串t连接到串s之后产生新串

{

SqStringstr;

inti;

str.length=s.length+t.length;

for(i=0;i

str.data[i]=s.data[i];

for(i=0;i

str.data[s.length+i]=t.data[i];

returnstr;

}

SqStringSubStr(SqStrings,inti,intj)

//由串s的第i个字符开始的的j个字符产生新串

{

SqStringstr;

intk;

str.length=0;

if(i<=0||i>s.length||j<0||i+j-1>s.length)

{

printf("参数不正确\n");

returnstr;//参数不正确,返回空串

}

for(k=i-1;k

str.data[k-i+1]=s.data[k];

str.length=j;

returnstr;

}

SqStringInsStr(SqStrings1,inti,SqStrings2)

//将串s2插入到串s1的第i个位置处

{

intj;

SqStringstr;

str.length=0;

if(i<=0||i>s1.length+1)//参数不正确时返回空串

{

printf("参数不正确\n");

returns1;

}

for(j=0;j

str.data[j]=s1.data[j];

for(j=0;j

str.data[i+j-1]=s2.data[j];

for(j=i-1;j

str.data[s2.length+j]=s1.data[j];

str.length=s1.length+s2.length;

returnstr;

}

SqStringDelStr(SqStrings,inti,intj)

//删除串s的第i个字符开始的j个字符产生新串

{

intk;

SqStringstr;

str.length=0;

if(i<=0||i>s.length||i+j>s.length+1)//参数不正确时返回空串

{

printf("参数不正确\n");

returnstr;

}

for(k=0;k

str.data[k]=s.data[k];

for(k=i+j-1;k

str.data[k-j]=s.data[k];

str.length=s.length-j;

returnstr;

}

SqStringRepStr(SqStrings,inti,intj,SqStringt)

//将串s的第i个字符开始的j个字符替换成串t产生新串

{

intk;

SqStringstr;

str.length=0;

if(i<=0||i>s.length||i+j-1>s.length)//参数不正确时返回空串

{

printf("参数不正确\n");

returnstr;

}

for(k=0;k

str.data[k]=s.data[k];

for(k=0;k

str.data[i+k-1]=t.data[k];

for(k=i+j-1;k

str.data[t.length+k-j]=s.data[k];

str.length=s.length-j+t.length;

returnstr;

}

voidDispStr(SqStrings)//输出串s的所有元素

{

inti;

if(s.length>0)

{

for(i=0;i

printf("%c",s.data[i]);

printf("\n");

}

}

//主程序

voidmain()

{

SqStrings,s1,s2,s3,s4;

printf("

(1)建立串s和串s1\n");

StrAssign(s,"abcdefghijklmn");

StrAssign(s1,"xyz");

printf("

(2)输出串s:

");

DispStr(s);

printf("(3)串s的长度:

%d\n",StrLength(s));

printf("(4)在串的第九个字符位置插入串s1而产生串s2\n");

s2=InsStr(s,9,s1);

printf("(5)输出串s2:

");

DispStr(s2);

printf("(6)删除串s第二个字符开始的个字符而产生串s2\n");

s2=DelStr(s,2,3);

printf("(7)输出串s2:

");DispStr(s2);

printf("(8)将串s第二个字符开始的个字符替换成串s1而产生串s2\n");

s2=RepStr(s,2,5,s1);

printf("(9)输出串s2:

");

DispStr(s2);

printf("(10)提取串s的第二个字符开始的个字符而产生串s3\n");

s3=SubStr(s,2,10);

printf("(11)输出串s3:

");

DispStr(s3);

printf("(12)将串s1和串s2连接起来而产生串s4\n");

s4=Concat(s1,s2);

printf("(13)输出串s4:

");

DispStr(s4);

}

/////////////////////////////////////////////////////////////////////实验2实现链串各种基本运算的算法

#include

#include

typedefstructsnode

{

chardata;

structsnode*next;

}LiString;

voidStrAssign(LiString*&s,chart[])

{

inti;

LiString*r,*p;

s=(LiString*)malloc(sizeof(LiString));

s->next=NULL;

r=s;

for(i=0;t[i]!

='\0';i++)

{

p=(LiString*)malloc(sizeof(LiString));

p->data=t[i];

p->next=NULL;

r->next=p;

r=p;

}

}

voidStrCopy(LiString*&s,LiString*t)

{

LiString*p=t->next,*q,*r;

s=(LiString*)malloc(sizeof(LiString));

s->next=NULL;

r=s;

while(p!

=NULL)//将t的所有节点复制到s

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

}

intStrEqual(LiString*s,LiString*t)

{

LiString*p=s->next,*q=t->next;

while(p!

=NULL&&q!

=NULL&&p->data==q->data)

{

p=p->next;

q=q->next;

}

if(p==NULL&&q==NULL)

return1;

else

return0;

}

intStrLength(LiString*s)

{

inti=0;

LiString*p=s->next;

while(p!

=NULL)

{

i++;

p=p->next;

}

returni;

}

LiString*Concat(LiString*s,LiString*t)

{

LiString*str,*p=s->next,*q,*r;

str=(LiString*)malloc(sizeof(LiString));

str->next=NULL;

r=str;

while(p!

=NULL)//将s的所有节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

p=t->next;

while(p!

=NULL)//将t的所有节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

returnstr;

}

LiString*SubStr(LiString*s,inti,intj)

{

intk;

LiString*str,*p=s->next,*q,*r;

str=(LiString*)malloc(sizeof(LiString));

str->next=NULL;

r=str;

if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))

{

printf("参数不正确\n");

returnstr;//参数不正确是返回空串

}

for(k=0;k

p=p->next;

for(k=1;k<=j;k++)//将s的第i个节点开始的j个节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

returnstr;

}

LiString*InsStr(LiString*s,inti,LiString*t)

{

intk;

LiString*str,*p=s->next,*p1=t->next,*q,*r;

str=(LiString*)malloc(sizeof(LiString));

str->next=NULL;

r=str;

if(i<=0||i>StrLength(s)+1)

{

printf("参数不正确\n");

returnstr;

}

for(k=1;k

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

while(p1!

=NULL)//将t的所有节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p1->data;

q->next=NULL;

r->next=q;

r=q;

p1=p1->next;

}

while(p!

=NULL)//将*p及其后的节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

returnstr;

}

LiString*DelStr(LiString*s,inti,intj)

{

intk;

LiString*str,*p=s->next,*q,*r;

str=(LiString*)malloc(sizeof(LiString));

str->next=NULL;

r=str;

if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))

{

printf("参数不正确\n");

returnstr;

}

for(k=0;k

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

for(k=0;k

p=p->next;

while(p!

=NULL)//将*p及其后的节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

returnstr;

}

LiString*RepStr(LiString*s,inti,intj,LiString*t)

{

intk;

LiString*str,*p=s->next,*p1=t->next,*q,*r;

str=(LiString*)malloc(sizeof(LiString));

str->next=NULL;

r=str;

if(i<=0||i>StrLength(s)||j<0||i+j-1>StrLength(s))

{

printf("参数不正确\n");

returnstr;

}

for(k=0;k

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

for(k=0;k

p=p->next;

while(p1!

=NULL)//将t的所有节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p1->data;

q->next=NULL;

r->next=q;

r=q;

p1=p1->next;

}

while(p!

=NULL)//将*p及其后的节点复制到str

{

q=(LiString*)malloc(sizeof(LiString));

q->data=p->data;

q->next=NULL;

r->next=q;

r=q;

p=p->next;

}

returnstr;

}

voidDispStr(LiString*s)

{

LiString*p=s->next;

while(p!

=NULL)

{

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

//主程序

voidmain()

{

LiString*s,*s1,*s2,*s3,*s4;

printf("

(1)建立串s和串s1\n");

StrAssign(s,"abcdefghijklmn");

StrAssign(s1,"xyz");

printf("

(2)输出串s:

");DispStr(s);

printf("(3)串s的长度:

%d\n",StrLength(s));

printf("(4)在串s的第九个字符位置插入串s1而产生串s2\n");

s2=InsStr(s,9,s1);

printf("(5)输出串s2:

");DispStr(s2);

printf("(6)删除串s第二个字符开始的五个字符而产生串s2\n");

s2=DelStr(s,2,3);

printf("(7)输出串s2:

");DispStr(s2);

printf("(8)将串s第二个字符开始的五个字符替换成串s1而产生串s2\n");

s2=RepStr(s,2,5,s1);

printf("(9)输出串s2:

");DispStr(s2);

printf("(10)提取串s的第二个字符开始的十个字符而产生串s3\n");

s3=SubStr(s,2,10);

printf("(11)输出串s3:

");DispStr(s3);

printf("(12)将串s1和串s2连接起来而产生串s4\n");

s4=Concat(s1,s2);

printf("(13)输出串s4:

");DispStr(s4);

}

/////////////////////////////////////////////////////////////////////实验3顺序串的各种模式匹配运算

编写一个程序,实现顺序串的各种模式匹配运算,并在此基础上完成如下功能:

(1)建立“abcabcdabcdeabcdefabcdefg”目标串s和“abcdeabcdefab”模式串t。

(2)采用简单匹配算法求t在s中的位置。

(3)由模式串t求出next值和nextval值。

(4)采用KMP算法求出t在s中的位置。

(5)采用改进的KMP算法求出t在s中的位置。

#include

#include

#defineMaxSize100

typedefstruct

{

chardata[MaxSize];//定义可容纳MaxSize个字符空间

intlength;//标记当前实际串长

}SqString;

voidStrAssign(SqString&str,charcstr[])

{

inti;

for(i=0;cstr[i]!

='\0';i++)

str.data[i]=cstr[i];

str.length=i;

}

voidDispStr(SqStrings)

{

inti;

if(s.length>0)

{

for(i=0;i

printf("%c",s.data[i]);

printf("\n");

}

}

intIndex(SqStrings,SqStringt)//简单匹配算法

{

inti=0,j=0,k;

while(i

{

if(s.data[i]==t.data[j])//继续匹配下一个字符

{

i++;

j++;

}

else//主串、子串指针回溯重新开始下一次匹配

{

i=i-j+1;

j=0;

}

}

if(j>=t.length)

k=i-t.length;//返回匹配的第一个字符的下标

else

k=-1;//模式匹配不成功

returnk;

}

voidGetNext(SqStringt,intnext[])//由模式串t求出next值

{

intj,k;

j=0;k=-1;next[0]=-1;

while(j

{

if(k==-1||t.data[j]==t.data[k])

{

j++;

k++;

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

当前位置:首页 > 高等教育 > 历史学

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

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