文章目录
一、将顺序串r中所有值为ch1的字符转换为ch2的字符
//替换串中指定元素
int StrReplaceX(SString *S,char ch1,char ch2){
for(int i=0;i<S->len;i++){
if(S->ch[i]==ch1)
{
S->ch[i]=ch2;
}
}
return 1;
}
二、将顺序串r中所有字符按照相反的次序仍存放在r中
法一:
//所有字符按照相反的次序仍存放在s中
void Reverse(SString *S){
char temp;
for(int i=0;i<(S->len)/2;i++){
temp=S->ch[i];
S->ch[i]=S->ch[S->len-i-1];
S->ch[S->len-i-1]=temp;
}
}
法二:利用栈结构
//利用栈逆置
void ReverseStack(SString *S,SeqStack *stack){
char data;
for(int i=0;i<S->len;i++){
Push(stack,S->ch[i]);
}
for(int j=0;j<S->len;j++){
Pop(stack,&data);
S->ch[j]=data;
}
}
三、从顺序串中删除所有值等于ch的字符
//从顺序串中删除所有值等于ch的字符
void deletech(SString *S,char ch){
int j=0;
for(int i=0;i<S->len;i++){
if(S->ch[i]!=ch){
S->ch[j]=S->ch[i];
j++;
}
}
S->len=j;
}
四、从顺序串r中删除所有与r1相同的子串
//从顺序串r中删除所有与r1相同的子串
void deletsub(SString *S,SString *Sub){
int flag =StrIndex(S,0,Sub);
while(flag!=-1){
//进行移位操作
for(int i=flag;i<S->len-Sub->len;i++){
S->ch[i]=S->ch[i+Sub->len];
}
S->len=S->len-Sub->len;
flag =StrIndex(S,flag,Sub);
}
}
//定位操作(修改)
int StrIndex(SString *S,int pos,SString *T){
int i=0,m=S->len,n=T->len;
SString Sub;
for(i=pos;i<m-n+1;i++){
SubString2(&Sub,S,i,n);
if(StrCompare(&Sub,T)==0){
return i;
}
}
return -1;
}
//求子串2
int SubString2(SString *Sub,SString *S,int pos,int len){
//是否越界
int j=0;
if(pos+len>S->len){
return 0;
}else{
for(int i=pos;i<pos+len;i++){
Sub->ch[j]=S->ch[i];
j++;
}
Sub->len=len;
return 1;
}
}
//串比较
int StrCompare(SString *S,SString *T){
for(int i=0;i<S->len&&i<T->len;i++){
if(S->ch[i]!=T->ch[i])
return S->ch[i]-T->ch[i];
}
return S->len-T->len;
}
五、编写一个函数将顺序串s1中的第i个字符到第j个字符之间的字符用s2串替换
//编写一个函数将顺序串s1中的第i个字符到第j个字符之间的字符用s2串替换
int replacei2j(SString *S1,int i,int j,SString *S2){
if(i>j){
printf("位置不合法!\n");
return 0;
}
if(j-i+1>S2->len){
int x=0;
for(int k=i-1;k<=j-1;k++){
S1->ch[k]=S2->ch[x];
x++;
if(x==S2->len){
x=0;
}
}
return 1;
}
else{
int x=0;
for(int k=i-1;k<=j-1;k++){
S1->ch[k]=S2->ch[x];
x++;
}
return 1;
}
}
六、实现顺序串的基本操作StrReplace(&s,t,v)
//StrReplace(&s,t,v)
int StrReplace(SString *S1,SString *Sub ,SString *S2){
//在主串中寻找子串
//确定起始位置和结束位置 调用 replacei2j
int flag =StrIndex(S1,0,Sub);
while(flag!=-1){
//找到第一次出现的子串 进行替换操作
replacei2j(S1,flag+1,flag+Sub->len,S2);
flag =StrIndex(S1,flag,Sub);
}
}
七、使用(链串)单链表实现模式匹配
//带头结点的单链表实现串的模式匹配算法
Link * SreIndex(LkString *S,LkString *T){
LinkNode *sp,*tp,*start;
sp=S->next;
tp=T->next;
start=S;
while(sp!=NULL && tp!=NULL){
if(sp->ch==tp->ch){
sp=sp->next;
tp=tp->next;
}else{
start=start->next;
sp=start;
tp=T->next;
}
}
if(tp==NULL) return start;
else return 0;
}