数据结构中的串操作详解

萌到你眼炸
931次浏览
2021年02月11日 03:46
最佳经验
本文由作者推荐

-

2021年2月11日发(作者:江心补漏)


串操作:串赋值;串复制;串比较;求串长;串联接;求子串;串插入;串删除;子串定位;


子串替




串比较



int StrCompar e(s,t)/*


串的比较,若


s>t


返回值


>0,


否则反之


*/


sting *s,*t;


{



int i=0;



while(( s->ch[i]=t->ch[i])&&(s->ch[i]!='0')&&(t->ch[i]!='0 '))




i++;



return s->ch[i]-t->ch[i];/*


返回最后位置对应字符的


ASCII


码 值的差


*/


}



求串长



int StrLength(s)




/*


求串长


*/


string *s;


{



int i=0;



s->len=0;



while(s->ch[i]!='0')



/*


诸葛统计字符,统计结果存入串


s


的


len


域中


*/




s->len++;



return s->len;


/ *


返回统计结果


*


、

< br>


}



串联接



void StrConcat(l,s,t)



/*

< br>联接串


s


和串


t


于串变量


l


中


*/


string *s,*t,*l;


{



int i,j;



if(s->len+t->len>stringlen)




printf(


结果串


l


的长度超过串的定长


stringlen!n



else




{





for(i=0;s->ch[i]!='0';i++)






l->ch[i]=s->ch[i];




/*


复制


s


串到


l


中


*/





for(j=0;t->ch[j]!='0';j++)






l->ch[i+j]=t->ch[t];


/*


将


t


串连接到


s


串之后存到


l


中


*/





l[i+j]='0';




/*


在


l


串中添加结 束标志


*/





l->len=s->len+t->len;

< p>
/*


计算结果串


l


的串长 度


*/




}


}



求子串



void SubString(t,s,i,len)






/*


将主 串


S


之中第


i


个字符起的长度为


LEN


的子串变量


t


中


*/


STRING *t,*s;


int i,len;


{



int j;



if((i<0)||(i>=s->len))




printf(


字串的开始位置


i


越界错误


n



else




if((len<0)||(len>s->len-i))





printf(

< br>字串的长度


len


越过主串错误


n




else




{





for(j=0;j





t->ch[j]=s->ch[i];


< br>/*


将所求字串存入


t


串中


*/





t->ch[j]='0';






/*


为字 串


t


添加结束标志


*/





t->len=len;




/*


设置字串长度


*/









}


}



字串的定位操作常称作模式匹配 ,子串


t


称作模式,在主串


s


中确定


t


的位置的过程称作匹

< br>配过程。


在文本编辑、


文件检索和各种串处理系统中有着 广泛的应用,


是最重要的串运算之


一。



如利用串比较、求串长和求子串


3


中基 本操作实现模式匹配的算法:



int



StrIndxe(s,t)


< /p>


/*


利用串的基本运算实现模式匹配,匹配成功返回子串位置,否 则返回


-1*/


RSTING *s,*t;


{


int n,m,i,bool;



n=StrLength(s);



/*


求主串


s


的长度赋值给


n*/



m=StrL ength(t);/*


求模式串


t


的 长度赋值给


m*/



i=0;bool=-1;



/*< /p>


初始化,从


s


串中的第一个字符


(


即下标为


0)


开始匹 配并置状态变量


bool


为负数


*/



while((i





/*< /p>


当长度够且未找到模式串的一个匹配则继续找


*/





{






SubString(l,s,i,m);






if(StrCompare(l,t)==0)








/*


若相等设状态变量值为正数,否 则从下一个位置开始找


*/







bool=1;







else



i++;





}




if(bool>0)





return 1;



/*


若状态变量大于


0


输出子串位置


i


,否则输出


-1*/




else





return -1;

-


-


-


-


-


-


-


-