(1)、将串str中所有值为ch1的字符转换成ch2的字符,如果str为空串,或者串中不含值为ch1的字符则什么都不做
(2)、实现串str的逆转函数,如果str为空串,则什么都不做
(3)、删除str中值为ch的所有字符,如果str为空,或不含有ch的字符则什么都不做
typedef struct{
char ch[maxSize];
int length;
}Str;
void delete_ch(Str &str,char ch){
while(str.length!=0){
for(int i=0;i<str.length;){
if(str.ch[i]==ch){
for(int j=i;j<str.length-1;j++)
str.ch[j]=str.ch[j+1];
str.length--;
}else i++;
str.ch[str.length]='\0';
}
}
}
(4)、从串str中的pos位置起,求出与substr串匹配的子串位置
void get_next(Str substr,int next[]){
int i=1,j=0; //j是当前子串最长相等前后缀长度
next[1]=0;
while(i<substr.length){
if(j==0||substr.ch[i]==substr.ch[j]){
++i;++j;next[i]=j; //01是确定的
}
else j=next[j];
}
}
int Kmp(Str str,Str substr,int next[],int pos){
int i=pos,j=1;
while(i<=str.length&&j<=substr.length){
if(j==0||str.ch[i]==substr.ch[j]){
++i;++j;
}
else j=next[j];
}
if(j>substr.length) return i-substr.length;//得到与模式串匹配的子串的首字符位置
else return 0;
}
2、采用定长顺序存储表示串,编写函数,删除串中下标为i的字符开始,如果第i个字符后没有足够的j个字符,则有几个删除几个
typedef struct{
char ch[maxSize];
int length;
}Str;
int Delete_i(Str &str,int i,int j){
if(i<str.length&&i>=0&&j>=0){
for(int k=i+j;k<str.length;k++){
str.ch[k-j]=str.ch[k];
}
str.length-=(str.length-i<j?str.length-i:j);
}
str.ch[str.length]='\0';
}
3、采用顺序存储的方式存储串,编写函数将串str1中下标i到j之间的字符(包括ij)用str2串替换
取str1的0~i-1,j+1~length-j-1,两个子串strl1,strl2,(strl1+str2)+strl2
typedef struct{
char ch[Maxsize];
int length;
}Str;
//链接
int concat(Str &str,Str str1,Str str2){
if(str.ch){
free(str.ch);
str.ch=NULL;
}
str.ch=(char *)malloc(sizeof(char)*(str1.length+str2.length+1));
if(str.ch==NULL) return false;
int i=0;
while(i<str1.length){
str.ch[i]=str1.ch[i];
++i;
}
int j=0;
while(j<=str2.length){
str.ch[i+j]=str2.ch[j];
++j;
}
str.length=str1.length+str2.length;
return true;
}
//求子串
int substring(Str &substr,Str str,int pos,int len){
if(pos<0||pos>=str.length||len<0||len>str.length-pos)
return false;
if(substr.ch){
free(substr.ch);
substr.ch=NULL;
}
if(len==0){
substr.ch=NULL;
substr.length=0;
return true;
}
else{
substr.ch=(char*)malloc(sizeof(char)*(len+1));
int i=pos;
int j=0;
while(i<pos+len){
substr.ch[j]=str.ch[i];
++i;
++j;
}
substr.ch[j]=NULL;
return true;
}
}
//子串替换
int stuff(Str &str1,Str str2,int i,int j){
Str strl1;strl1.ch=NULL;strl1.length=0;
Str strl2;strl2.ch=NULL;strl2.length=0;
Str temp_str;
if(!substring(strl1,str1,0,i)) return 0;
if(!substring(strl2,str1,j+1,str1.length-j-1)) return 0;
if(!contact(temp_str,strl1,str2)) return 0;
if(!contact(str1,temp_str,strl2)) return 0;
return 1;
}
4、编写一个函数计算子串在主串中的出现次数,不考虑子串重叠。
5、构造串的链表结点数据结构,编写函数找出串str1中第一个不在str2中出现的字符
typedef struct SNode{
char data;
struct Str *next;
}SNode;
char findfirst(SNode &str1,SNode &str2){
SNode *p=str1,*q=str2;
while(p){
bool flag=true;
while(q){
if(p->data==q->data){
flag=true;
break;
}
q=q->next;
if(flag==false) return p->data;
}
p=p->next;
}
}