数据结构 - 字符串运算

字符串运算

#include <stdio.h>
#define MaxSize 100
typedef struct
{
    char data[MaxSize];
    int length;
} SqString;
int StrLength(SqString s){//求串长 
	return s.length;
}
void StrAssign(SqString &s,char cstr[])//串赋值 
{
    int i;
    for(i=0; cstr[i]!='\0'; i++)
    s.data[i]=cstr[i];
    s.length=i;
}
SqString Concat(SqString s,SqString t)//串连接
{
    SqString str;
	int i;
	str.length=s.length+t.length;
	for (i=0;i<s.length;i++)	//将s.data[0..s.length-1]复制到str
		str.data[i]=s.data[i];
	for (i=0;i<t.length;i++)	//将t.data[0..t.length-1]复制到str
		str.data[s.length+i]=t.data[i];
	return str;
}
SqString SubStr(SqString s,int i,int j)//求子串
{	SqString str;
	int k;
	str.length=0;
	if (i<=0 || i>s.length || j<0 || i+j-1>s.length)
		return str;					//参数不正确时返回空串
	for (k=i-1;k<i+j-1;k++)  		//将s.data[i..i+j]复制到str
		str.data[k-i+1]=s.data[k];
	str.length=j;
	return str;
}
int StrEqual(SqString s,SqString t)//串比较 
{
    int i;
     for(i=0; i<s.length; i++){
     	 if(s.data[i]!=t.data[i]){
        	if(s.data[i]>t.data[i])
        	return 1;
        	else
        	return -1;
		}
		else{
			if(s.length!=t.length){
    			if(s.length>t.length) return 1;
    			else return -1;
			}
		}
	 }
    return 0;
}
void get_next(SqString T,int next[]){
	int i=1,j=0;
	next[1]=0;//固定结论
	while(i<T.length){
		if(j==0 || T.data[i]==T.data[j]){
			++i;
			++j;
			//若pi=pj,则next[j+1]=next[j]+1 
			next[i]=j;
		}
		else //否则令j=next[j],循环继续 
		j=next[j];
	} 
} 
int Index_KMP(SqString S,SqString T){
	int i=1,j=1;
	int next[T.length+1];
	get_next(T,next);
	while(i<=S.length && j<=T.length){
		if(j==0 || S.data[i]==T.data[j]){
			++i;
			++j;//继续比较后继字符  
		}
		else 
		j=next[j];//模式串向右移动 
	}
	if(j>T.length)
	return i-T.length;//匹配成功 
	else
	return 0;
} 
SqString InsStr(SqString s1,int i,SqString s2)//串插入
{	int j;
	SqString str;
	str.length=0;
	if (i<=0 || i>s1.length+1)  //参数不正确时返回空串
		return str;
	for (j=0;j<i-1;j++)      		//将s1.data[0..i-2]复制到str
		str.data[j]=s1.data[j];
	for (j=0;j<s2.length;j++)		//将s2.data[0..s2.length-1]复制到str
		str.data[i+j-1]=s2.data[j];
	for (j=i-1;j<s1.length;j++)		//将s1.data[i-1..s1.length-1]复制到str
		str.data[s2.length+j]=s1.data[j];
	str.length=s1.length+s2.length;
	return str;
}
SqString DelStr(SqString s,int i,int j)//串删除
{	int k;
	SqString str;
	str.length=0;
	if (i<=0 || i>s.length || i+j>s.length+1) //参数不正确时返回空串
		return str;
	for (k=0;k<i-1;k++)       		//将s.data[0..i-2]复制到str
		str.data[k]=s.data[k];
	for (k=i+j-1;k<s.length;k++)	//将s.data[i+j-1..s.length-1]复制到str
		str.data[k-j]=s.data[k];
	str.length=s.length-j;
	return str;
}
SqString RepStr(SqString s,int i,int j,SqString t)//串替换
{	int k;
	SqString str;
	str.length=0;
	if (i<=0 || i>s.length || i+j-1>s.length) //参数不正确时返回空串
		return str;
	for (k=0;k<i-1;k++)				//将s.data[0..i-2]复制到str
		str.data[k]=s.data[k];
	for (k=0;k<t.length;k++)   		//将t.data[0..t.length-1]复制到str
		str.data[i+k-1]=t.data[k];
	for (k=i+j-1;k<s.length;k++)	//将s.data[i+j-1..s.length-1]复制到str
		str.data[t.length+k-j]=s.data[k];
	str.length=s.length-j+t.length;
	return str;
}
int main()
{
	SqString s,s1,s2,s3,s4,s5;
	printf("顺序串的基本运算如下:\n");
	printf("  (1)建立串s和串s1\n");
	StrAssign(s,"abcdefghijklmn");
	StrAssign(s1,"123");
	StrAssign(s5,"cd");
	printf("  (2)输出串s: %s\n",s);
	printf("  (3)串s的长度:%d\n",StrLength(s));
	printf("  (4)在串s的第9个字符位置插入串s1而产生串s2\n");
	s2=InsStr(s,9,s1);
	printf("  (5)输出串s2: %s\n",s2);
	printf("  (6)删除串s第2个字符开始的5个字符而产生串s2\n");
	s2=DelStr(s,2,3);
	printf("  (7)输出串s2: %s\n",s2);
	printf("  (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");
	s2=RepStr(s,2,5,s1);
	printf("  (9)输出串s2: %s\n",s2);
	printf("  (10)提取串s的第2个字符开始的10个字符而产生串s3\n");
	s3=SubStr(s,2,10);
	printf("  (11)输出串s3: %s\n",s3);
	printf("  (12)将串s1和串s2连接起来而产生串s4\n");
	s4=Concat(s1,s2);
	printf("  (13)输出串s4: %s\n",s4);
	printf("  (14)s5在字符串s中的第一次出现的位置%d\n",Index_KMP(s,s5));
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值