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

结构体定义

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

运行结果:
运行结果

猜你喜欢

转载自blog.csdn.net/qq_42242452/article/details/124820254