串 p103

(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;			
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值