数据结构--串

  • 串其实就是字符串,在c语言中头文件 #include 就包含了对其的大部分操作
  • 大话数据结构上列出了对串的一些基本函数操作,将字符数组的第一个位置存储为整个字符串的长度,但我没有那么写,而是按一般思维就直接将字符串直接存入数组

代码实现

#include
#include

#define MAX 40

bool StrAssign(char Main_S[],char* chars);
void StrCopy(char Main_S[],char Main_F[]);
bool StrEmpty(char Main_S[]);
void StrClear(char Main_S[]);
int StrCompare(char Main_S[],char T[]);
int StrLength(char S[]);
bool Concat(char T[],char S1[],char S2[]);
bool SubString(char sub[],char Main_S[],int pos,int len);
int Index(char Main_S[],char T[],int pos);
bool StrInsert(char S[],int pos,char T[]);
bool StrDelete(char S[],int pos,char len); 
bool Replace(char S[],char T[],char V[]);
void StrPrint(char H[]);

int main(){
	char Main_S[MAX],sub[MAX];
	char chars[MAX]="ABCCBAACBAACABBA";
	char Main_F[MAX]="ABCCBAACBAACABBF";
	char T[MAX]="AACBAA";
	char Y[MAX]="AA";
	char H[MAX]="aa"; 
	char S1[MAX]="woyidingyaobiandecholihai";
	char S2[MAX]="zuizhongyaodeshipingpinganan";
	int len,c,pos,f;
	
	StrClear(Main_S);
	
	if(StrEmpty(Main_S)){
		printf("是空串!\n");
	}
	
	if(StrAssign(Main_S,chars)){
		printf("%s\n",Main_S);
	}
	else
		printf("生成串失败!\n");
	
		
	StrCopy(Main_S,Main_F);
	printf("复制成功后的主串是:%s\n",Main_S);
	
	c=StrCompare(Main_S,T);
	if(c<0){
		printf("第一个串比第二个串小\n");
	}
	else if(c==0){
		printf("第一个串等于第二个串\n");
	}
	else if(c>0){
		printf("第一个串比第二个串大\n");
	}
	
	len=StrLength(Main_S);
	printf("串的长度是:%d\n",len);
	
/*	if(Concat(T,S1,S2)){
		printf("未截断  联接好的串为:%s\n",T);
	}
	else{
		printf("截断S2  联接好的串为:%s\n",T);
	}*/
	
/*	printf("请输入要截取的位置和截取的长度:");
	scanf("%d %d",&pos,&len); 
	if(SubString(sub,Main_S,pos,len)){
		printf("成功! 截取下的串为:%s\n",sub);
	}
	else{
		printf("截取失败!\n");
	}*/
	
/*	printf("请输入开始查找的位置:");
	scanf("%d",&pos);
	f=Index(Main_S,T,pos);
	if(f==0)
		printf("从当前位置开始,在主串中没有符合要求的字串!\n");
	else{
		printf("从当前位置开始,字串第一次出现的位置是:%d\n",f);
	}*/
	
/*	printf("请输入插入在什么位置之后:");
	scanf("%d",&pos);
	if(StrInsert(Main_S,pos,T)){
		printf("完全插入,插入后的串为:%s\n",Main_S);
	}
	else{
		printf("部分插入,插入后的串为:%s\n",Main_S);
	}*/ 
	
/*	printf("请输入要删除的位置和删除的长度:");
	scanf("%d %d",&pos,&len); 
	if(StrDelete(Main_S,pos,len)){
		printf("删除成功!删除后的串为:%s\n",Main_S);
	}
	else
		printf("删除失败!\n");*/
		
	
	if(Replace(Main_S,Y,H)){
		printf("替换成功!替换后的串为:%s\n",Main_S);
	}
	else
		printf("替换失败!\n");
		
	StrPrint(Y);
}

bool StrAssign(char Main_S[],char* chars){
	int i;
	if(StrLength(chars)>MAX)
		return false;
	else{
		for(i=0;i<=StrLength(chars);i++)
			Main_S[i]=*(chars+i);
		return true;
	}
}

void StrCopy(char Main_S[],char Main_F[]){
	int i;
	for(i=0;i<=StrLength(Main_F);i++)
		Main_S[i]=Main_F[i];
}

bool StrEmpty(char Main_S[]){
	int i;
	i=StrLength(Main_S);
	if(i==0)
		return true;
	else
		return false;
}

void StrClear(char Main_S[]){
	Main_S[0]='\0';
}

int StrCompare(char Main_S[],char T[]){
	int m=StrLength(Main_S);
	int n=StrLength(T);
	int i;
	for(i=0;i<=n&&i<=m;i++){
		if(Main_S[i]!=T[i])
			return Main_S[i]-T[i];
	}
	return m-n;
}

int StrLength(char S[]){
	int i=0;
	while(S[i]!='\0')
		i++;
	return i;
}

bool Concat(char T[],char S1[],char S2[]){
	int i;
	if(StrLength(S1)+StrLength(S2)<=MAX){
		//未截断
		for(i=0;i<=StrLength(S1);i++)
			T[i]=S1[i];
		for(i=0;i<=StrLength(S2);i++)
			T[StrLength(S1)+i]=S2[i];
		return true; 
	}
	else{
		//截断S2
		for(i=0;i<=StrLength(S1);i++)
			T[i]=S1[i];
		for(i=0;i<=MAX-StrLength(S1);i++)
			T[StrLength(S1)+i]=S2[i];
		T[MAX-1]='\0';
		return false;
	}
}

bool SubString(char sub[],char Main_S[],int pos,int len){
	int i;
	if(pos<0||pos>StrLength(Main_S)||len<0||len>StrLength(Main_S)-pos+1)
		return false;
	for(i=0;i<len;i++)
		sub[i]=Main_S[pos-1+i];
	return true;
}

int Index(char Main_S[],char T[],int pos){
	//返回子串T在主串中第pos个字符后的位置,如果没有则为0
	//T非空
	int i,j;
	if(pos>=1&&pos<StrLength(Main_S)){
		i=pos-1;
		j=0;
		while(i<StrLength(Main_S)&&j<StrLength(T)){
			if(Main_S[i]==T[j]){
				i++;
				j++;
			}
			else{
				i=i-j+1;//下标和pos不符 
				j=0;
			}
			
			
		}
		if(j==StrLength(T))
			return i-StrLength(T)+1;
		else 
			return 0;
	} 
	else
		return 0;
}

bool StrInsert(char S[],int pos,char T[]){
	//串S和串T存在,1<=pos<=StrLengh(S)+1 
	//在串S的第pos个字符后插入串T,完全插入为true
	int i;
	if(pos<0||pos>StrLength(S)) 
		return false;
	if(StrLength(S)+StrLength(T)<=MAX){
		//完全插入
		for(i=StrLength(S);i>=pos;i--)
			S[i+StrLength(T)]=S[i];
		for(i=pos;i<pos+StrLength(T);i++)
			S[i]=T[i-pos];
		return true;
	}
	else{
		//部分插入
		for(i=MAX;i>=pos+StrLength(T);i--)
			S[i]=S[i-StrLength(T)];
		for(i=pos;i<pos+StrLength(T)&&i<=MAX;i++)
			S[i]=T[i-pos];
		return false;			
	}
}

bool StrDelete(char S[],int pos,char len){
	//串S存在,从串S中删除自第pos个字符起长度为len的子串
	int i;
	if(pos<0||pos>StrLength(S)-len||len<0)
		return false;
	for(i=pos+len;i<=StrLength(S);i++)
		S[i-len]=S[i];
	return true; 
}

bool Replace(char S[],char T[],char V[]){
	//串S T V存在,T是非空串
	//用V替换主串S中出现的所有与T相同的不重叠的子串 
	int i=1;
	if(StrEmpty(T))
		return false;
	do{
		i=Index(S,T,i);
		if(i){
			StrDelete(S,i-1,StrLength(T));
			if(!StrInsert(S,i-1,V))//不能完全插入
				return false;
			i+=StrLength(V);
		}
	} while(i);
	return true;
}

void StrPrint(char H[]){
	int i;
	for(i=0;i<=StrLength(H);i++) 
		printf("%c",H[i]);
	printf("\n");
}

你可能感兴趣的:(数据结构--串)