数据结构——串的基本操作实现

结构体定义

typedef char ElemType;

typedef struct{
	ElemType *ch ;
	int length;
}SString; 

初始化串

/*初始化串*/
void InitStr(SString &Str){
	Str.length=0;
	Str.ch=NULL;//S的数据存储指向为空.	
}

给串赋值

/*
	赋值
	1.判断str中的ch是否为空
	2.定位获得ch的长度
	3.str中的ch申请空间,并为str中的ch赋值 
*/
bool StrAssign(SString &Str,char *ch){
	if(Str.ch){//如果Str中的数据不为空 
		free(Str.ch);
		Str.ch=NULL;//Str的数据存储指向为空.	
	}
	
	int len=0;
	char *c=ch;//指向传过来的ch数组
	//定位ch的长度,
	while(*c){//解引用 ,当c中的数据不为空 
		len++;
		c++;
	} 
	//当ch数组为空 
	if(len==0){
		cout<<"空串,赋值失败!"<<endl;
		InitStr(Str);
		return false;
	}else{
		Str.ch=(char *)malloc(sizeof(char)*(len+1));
		//cout<<(int)Str.ch[len]<<endl;
		if(Str.ch==NULL){
			cout<<"空间分配失败!"<<endl;
			return false;
		}else{
			for(int i=0;i<=len;i++){
				Str.ch[i]=ch[i];
			}
		
			Str.length=len;
			return true;
		} 
	}
}

求主串的子串

/*
	求主串的子串 
	str为主串
	SubStr为子串 
	从主串中的第pos个位置开始,依次把len个元素作为字串substr的元素 
*/
bool GetSubString(SString &Str,SString &SubStr,int pos,int len ){
	
	if(pos<0||pos>=Str.length||len<0||len>Str.length-pos) {
		cout<<"位置或者长度不合法!"<<endl;
		return false;
	}
	
	if(SubStr.ch){//如果SubStr中的数据不为空 
		free(SubStr.ch);
		SubStr.ch=NULL;//SubStr的数据存储指向为空.	
	}
	
	if(len==0){
		SubStr.ch=NULL;
		SubStr.length=0;
		cout<<"字串的长度为0"<<endl;
		return true;
	}else{
		//分配空间 
		SubStr.ch=(char *)malloc(sizeof(char)*(len+1));
		
		int sublen=0;//字串长度 
		for(int i=pos-1,j=0;j<len;i++,j++){//i<pos+len-1
			SubStr.ch[j]=Str.ch[i] ;
			sublen++; 
		}
		cout<<sublen;
		SubStr.ch[sublen]='\0';//以 '\0'标志着串的结尾
		SubStr.length = sublen;
		return true;
	}
}

比较两个字符串的值

/*
	比较两个字符串的值
	S>T :返回值>0 
	S=T	:返回值=0 
	S<T	:返回值<0 
*/
int StrCompare(SString S,SString T){
	for(int i=0;i<S.length&&i<T.length;i++){
		if(S.ch[i]!=T.ch[i])
		return S.ch[i]-T.ch[i];
	}
	//如果所有字符都相等,那么长度更长的字符串更大
	return S.length -T.length; 
}

拼接两个字符串

/*
	拼接串
	把串s2拼接在s1的后面生成一个新的串 
*/
bool Concat(SString &Str,SString &S1,SString &S2){
	if(Str.ch){//如果Str中的数据不为空 
		free(Str.ch);
		Str.ch=NULL;//Str的数据存储指向为空.	
	}
	
	Str.ch=(char *)malloc(sizeof(char)*(S1.length+S2.length+1));
	if(Str.ch==NULL){
		cout<<"空间分配失败!"<<endl;
		return false;
	}else{
		int i=0,j=0;
		//将子串1的内容写入Str中 
		for(;i<S1.length;i++){
			Str.ch[i]=S1.ch[i];
		}
		//将子串2的内容写入Str中 
		for(;j<S2.length;j++){
			Str.ch[i+j]=S2.ch[j];
		}
		Str.ch[i+j]='\0';
		Str.length=S1.length+S2.length;
		return true;
	}
}

复制串

/*
	复制串
	把Str中的值赋值一份给T 
*/
bool  StrCopy(SString &Str,SString &T){
	T.ch=(char *)malloc(sizeof(char)*(Str.length+1));
	
	//cout<<Str.length;
	for(int i=0;i<Str.length;i++) {
		T.ch[i]=Str.ch[i];
	}
	T.ch[Str.length]='\0'	;
	T.length=Str.length;
	return true;
} 

清空串

/*清空串 */
bool ClearStr(SString &Str){
	if(Str.ch){//如果Str中的数据不为空 
		free(Str.ch);
		Str.ch=NULL;//Str的数据存储指向为空.	
	}
	Str.length=0;
	return true;
}

具体实现

#include<iostream> 
#include<stdlib.h> 
using namespace std;

typedef char ElemType;

typedef struct{
	ElemType *ch ;
	int length;
}SString; 

/*初始化串*/
void InitStr(SString &Str){
	Str.length=0;
	Str.ch=NULL;//S的数据存储指向为空.	
}

/*
	赋值
	1.判断str中的ch是否为空
	2.定位获得ch的长度
	3.str中的ch申请空间,并为str中的ch赋值 
*/
bool StrAssign(SString &Str,char *ch){
	if(Str.ch){//如果Str中的数据不为空 
		free(Str.ch);
		Str.ch=NULL;//Str的数据存储指向为空.	
	}
	
	int len=0;
	char *c=ch;//指向传过来的ch数组
	//定位ch的长度,
	while(*c){//解引用 ,当c中的数据不为空 
		len++;
		c++;
	} 
	//当ch数组为空 
	if(len==0){
		cout<<"空串,赋值失败!"<<endl;
		InitStr(Str);
		return false;
	}else{
		Str.ch=(char *)malloc(sizeof(char)*(len+1));
		//cout<<(int)Str.ch[len]<<endl;
		if(Str.ch==NULL){
			cout<<"空间分配失败!"<<endl;
			return false;
		}else{
			for(int i=0;i<=len;i++){
				Str.ch[i]=ch[i];
			}
			Str.ch[len+1]='\0';
			Str.length=len;
			return true;
		} 
	}
}

/*
	求主串的子串 
	str为主串
	SubStr为子串 
	从主串中的第pos个位置开始,依次把len个元素作为字串substr的元素 
*/
bool GetSubString(SString &Str,SString &SubStr,int pos,int len ){
	
	if(pos<0||pos>=Str.length||len<0||len>Str.length-pos) {
		cout<<"位置或者长度不合法!"<<endl;
		return false;
	}
	
	if(SubStr.ch){//如果SubStr中的数据不为空 
		free(SubStr.ch);
		SubStr.ch=NULL;//SubStr的数据存储指向为空.	
	}
	
	if(len==0){
		SubStr.ch=NULL;
		SubStr.length=0;
		cout<<"字串的长度为0"<<endl;
		return true;
	}else{
		//分配空间 
		SubStr.ch=(char *)malloc(sizeof(char)*(len+1));
		
		int sublen=0;//字串长度 
		for(int i=pos-1,j=0;j<len;i++,j++){//i<pos+len-1
			SubStr.ch[j]=Str.ch[i] ;
			sublen++; 
		}
		cout<<sublen;
		SubStr.ch[sublen]='\0';//以 '\0'标志着串的结尾
		SubStr.length = sublen;
		return true;
	}
}


/*清空串 */
bool ClearStr(SString &Str){
	if(Str.ch){//如果Str中的数据不为空 
		free(Str.ch);
		Str.ch=NULL;//Str的数据存储指向为空.	
	}
	Str.length=0;
	return true;
}



/*
	拼接串
	把串s2拼接在s1的后面生成一个新的串 
*/
bool Concat(SString &Str,SString &S1,SString &S2){
	if(Str.ch){//如果Str中的数据不为空 
		free(Str.ch);
		Str.ch=NULL;//Str的数据存储指向为空.	
	}
	
	Str.ch=(char *)malloc(sizeof(char)*(S1.length+S2.length+1));
	if(Str.ch==NULL){
		cout<<"空间分配失败!"<<endl;
		return false;
	}else{
		int i=0,j=0;
		//将子串1的内容写入Str中 
		for(;i<S1.length;i++){
			Str.ch[i]=S1.ch[i];
		}
		//将子串2的内容写入Str中 
		for(;j<S2.length;j++){
			Str.ch[i+j]=S2.ch[j];
		}
		Str.ch[i+j]='\0';
		Str.length=S1.length+S2.length;
		return true;
	}
}

/*
	比较两个字符串的值
	S>T :返回值>0 
	S=T	:返回值=0 
	S<T	:返回值<0 
*/
int StrCompare(SString S,SString T){
	for(int i=0;i<S.length&&i<T.length;i++){
		if(S.ch[i]!=T.ch[i])
		return S.ch[i]-T.ch[i];
	}
	//如果所有字符都相等,那么长度更长的字符串更大
	return S.length -T.length; 
}

/*
	复制串
	把Str中的值赋值一份给T 
*/
bool  StrCopy(SString &Str,SString &T){
	T.ch=(char *)malloc(sizeof(char)*(Str.length+1));
	
	//cout<<Str.length;
	for(int i=0;i<Str.length;i++) {
		T.ch[i]=Str.ch[i];
	}
	T.ch[Str.length]='\0'	;
	T.length=Str.length;
	return true;
} 




int main(){
	SString str,str1,str2,str3,str4,str5,str6;
	InitStr(str);
	InitStr(str1);
	InitStr(str2);
	InitStr(str3);
	InitStr(str4);
	InitStr(str5);
	InitStr(str6);
	char ch1[] = "I am pig!";
    char ch2[] = "You are pig!";
    char ch3[] = "We are pig!";
	
	StrAssign(str1,ch1);
	StrAssign(str2,ch2);
	StrAssign(str3,ch3);
	
	cout<<"字符串1为:"<<str1.ch<<"   串的长度为:"<<str1.length<<endl;
	cout<<"字符串2为:"<<str2.ch<<"   串的长度为:"<<str2.length<<endl;
	cout<<"字符串3为:"<<str3.ch<<"   串的长度为:"<<str3.length<<endl;
	
	
	Concat(str,str1,str2);
	cout<<"合并字符串1和字符串2为:"<<str.ch<<"   合并之后长度为:"<<str.length<<endl;
	Concat(str4,str,str3);
	cout<<"全部字符串合并为:"<<str4.ch<<"   合并之后长度为:"<<str4.length<<endl;
	
	GetSubString(str,str5,7,10);
	cout<<"从合并后的总串中第7位开始取,取长度为10生成的字串为:"<<str5.ch<<"字串长度为:"<<str5.length<<endl;
	
		
	cout<<"字符串5比字符串1大:"<<StrCompare(str5,str1) <<endl;
	cout<<"字符串1比字符串5大:"<<StrCompare(str1,str5) <<endl;
	
	StrCopy(str2,str6);	
	cout<<"将字符串2复制一份给字符串6,字符串6为:"<<str6.ch<<"字串长度为:"<<str6.length<<endl;//<<str6.ch
	
	
	
	ClearStr(str1) ;
	ClearStr(str2) ;
	ClearStr(str3) ;
	ClearStr(str4) ;
	ClearStr(str5) ;
	ClearStr(str6) ;
	
	return 0;
}

运行结果:
运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值