分别定义两个结构体——串的定长顺序存储、串的堆式顺序存储
typedef struct
{
char ch[MAXSTRLEN+1];
int length;
}SString;
typedef struct
{
char *ch;
int length;
}HString;
问题:
1、编写函数,串用定长顺序存储表示来实现串的基本操作;
2、 编写串的匹配算法,实现查找功能。
算法思想阐述:
BF算法:首先S[1]和T[1]比较,若相等,则再比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则S向右移动一个字符的位置,再依次进行比较。如果存在k,1≤k≤N,且S[k+1…k+M]=T[1…M],则匹配成功;否则失败。
该算法最坏情况下要进行M*(N-M+1)次比较, 时间复杂度为O(M*N)。
一、各函数代码如下
解题一:
//生成串
Status StrAssign(SString &S,char chars[])
{
int i;
S[0]=strlen(chars);
for(i=0;chars[i]!='\0'&&i+1<MAXSTRLEN;i++){
S[i+1]=chars[i];
}
S[i+1]='\0';
return OK;
}
//输出串
void PrintStr(SString S)
{
int i;
for(i=1;i<S[0]+1;i++){
cout<<S[i];
}
cout<<endl;
}
//求串长
Status StrLength(SString S)
{
return S[0];
}
//判空
Status StrEmpty(SString S)
{
if(S[0]==0){
return OK;
}
else{
return FALSE;
}
}
//比较字符串
Status StrCompare(SString S,SString T)
{
int i=0;
for(i=0;i<S[0]&&i<T[0];i++){
if(S[i]!=T[i])
return S[i]-T[i];
}
return S[0]-T[0];
}
//字符串连接:用T返回由S1和S2连接成的新串
Status Concat(SString &T,SString S1,SString S2)
{
int i,j;
if(S1[0]+S2[0]<=MAXSTRLEN){
//未超出用户定义的最大串长
for(i=1;S1[i]!='\0';i++){
T[i]=S1[i];
}
for(j=1;S2[j]!='\0';j++){
T[S1[0]+j]=S2[j];
}
//两次循环连接两串
T[S1[0]+j+1]='\0';
T[0]=S1[0]+S2[0];
}
else if(S1[0]<MAXSTRLEN){
//超出用户定义的最大串长,这里会出现截断情况
for(i=1;S1[i]!='\0';i++){
T[i]=S1[i];
}
for(j=1;j<=MAXSTRLE


2207

被折叠的 条评论
为什么被折叠?



