串的基本操作实现源码|数据结构

typedef struct 
{
	char *ch;
	int length;
}HStirng;
ADT
{
	StrAssign(&T,chars);
	//chars是字符串常量
	//生成一个值等于chars的串T

	strCopy(&T,S)
	//串S存在
	//由串S复制得串T
	
	StrEmpty(S)
	//串S存在
	//若为空则返回true

	StrCompare(S,T)
	//S>T返回值大于0
	//S<T返回值小于0
	//S=T返回值等于0

	StrLength(S)
	//返回串S的长度

	ClearString(S)
	//将S清空

	Contact(&T,S1,S2)
	//用T返回S1,S2连接成的新串

	SubString(&Sub,S,Pos,len)
	//用Sub返回S第Pos个字符长度起长度为len的子串

	Index(S,T,Pos)
	//如果子串S中存在和串T值相同的子串,返回在主串第Pos个位置之后第一次出现的值

	Repalce(&Str,T,V)
	//用V替换所有主串Str中与T相等的不重叠子串

	StrInsert(&S,pos,T)
	//在串S的第Pos位插入串T

	StrDelete(&S,Pos,len)
	//在串S的第Pos位删除长度为len的子串

	DestroyString(&S)
	//串S被销毁
}ADT;
bool StrAssign(&T,chars)
{
	//delete[] 释放new分配的对象数组指针指向的内存
	if(T.ch)
	{
		delete[] T.ch;
	}
	char *ctemp = chars;
	T.length=0;

	//求T.length的长度
	while(*ctemp)
	{
		++T.length;
		++ctemp;
	}

	T.ch = new char[T.length+1];
	
	if(!T.ch)
	{
		printf("分配失败!");
		system(pause);
		exit(-1);
	}
	else
	{
		char *temp = T.ch;
		while(*chars)
		{
			*temp++ = *chars++;
		}
		printf("分配成功!");
		return true;
	}
bool StrCopy(&T,S)
{
	if(!S.ch)
	{
		printf("串S不存在!");
		system(pause);
   		 exit(0);
	}
	
	 if(T.ch)
	 {
	  delete[] T.ch;
	 }
	 
	T.length = S.length;
	T.ch = new char[S.length+1];
	
	if(!T.ch)
	 {
	  printf("分配失败!");
	  system(pause);
	  exit(-1);
	 }
	
	char *temps = S.ch;
	char *tempt = T.ch;
	
	while(*temps)
	{
		*tempt++ = *temps++;
	}
	*tempt = '\0';
	
	printf("成功!");
	return true;
}
bool StrEmpty(S)
{
	  if(!S.ch)
	  {
	   printf("串不存在!\n");
	   system(pause);
	   exit(0);
	  }
	 else
	 {
	 	if(!S.length)
	 	{
	 		printf("串为空!\n");
	 		return true;
	 	}
	 	else
	 	{
		    printf("串不为空!\n");
		    return false;
		}
	 }
	
}

在这里插入图片描述

int StrLength(S)
{
   if(!S.ch)
   {
	    printf("串不存在!\n");
	    system(pause);
	    exit(0);
   }
  else
  {
  	    printf("串的长度%d",S.length);
  	    return S.length;
  }

在这里插入图片描述

注意清空串跟一个串不存在的区别!
清空是ch="\0",length=0,但给他分配了内存空间
串不存在是没有分配内存空间

bool Contact(&T,S1,S2)
{
	if(!T.ch)
	{
	     printf("串不存在!\n");
             system(pause);
             exit(0);
	}

	T.length = S1.length+S2.length;
	T.ch = new char[T.length+1];

	if(!T.ch)
	{
	     printf("分配失败!\n");
             system(pause);
             exit(-1);
	}
	char *temp = T.ch;

	while(*S1.ch)
	{
		*temp++ = *S1.ch++;
	}
	
	while(*S2.ch)
	{
	       *temp++ = *S2.ch++;
	}
	
	*temp = '\0';
	printf("连接成功!\n");
	return true;
}
bool SubString(&Sub,S,pos,len)
{
	if(!S.ch)
	{
	     printf("串不存在!\n");
             system(pause);
             exit(0);
	}
	if(Sub.ch)
	{
	     delete[] Sub.ch;
	}

	if(Pos<1 || Pos>S.length || len<0 || len>S.length-Pos+1 )
	{
		printf("Pos&&len 错误!");
		Sub.ch = new char[1];
		*Sub.ch="\0";
		Sub.length = 0;
		return false;
	}

	Sub.ch = new char[len+1];
	char *temp = Sub.ch;
	for(int i=1;i != Pos;i++)
	{
		S.ch++;
	}

	for(i=0;i!=len;i++)
	{
		Sub.ch++ = S.ch++;
	}
	return true;
}
bool Index(S,T,pos)
{
	if(!S.ch || !T.ch)
	{
	     printf("串不存在!\n");
             system(pause);
             exit(0);
	}

	if(Pos <= 1 || Pos >= S.length)
	{
	    printf("Pos错误!");
	}
	else
	{
		char *tempt = T.ch;
	  	char *temps = S.ch;

		for(int i=0;i<Pos;i++)
		{
			tempt++;
		}
		
				
		while(*T.ch&&*S.ch)
		{
		if(*tempt == *temps)
		{
			tempt++;
			temps++;
		}
		else
		{
			tempt -= temps.length;
			temps = S.ch; 
		}

		}
	}
     if(tempst.length > T.length)
     {
     	printf("匹配成功");
     	return tempt.length-temps.length;
     }
     else
     	return false;
} 
bool StringReplace(HStirng &Str,HStirng T,HStirng V)
{
	if(!Str.ch || !T.ch || !V.ch || 0 == T.length)
	{
		printf("串不存在或为空!");
		system(pause);
		exit(0);
	} 
	int pos = Index(S,T,1);
	while(pos)
	{
		int nlength = Str.lenght + V.length - T.length;
		char *ctemp = new char[nlength+1];
		if(!ctemp)
		{
			printf("函数执行失败!");
			system(pause);
                        exit(-1);
		}
		char *temp = ctemp;
		char *stemp = Str.ch;
		char *vtemp = V.ch;

		for(int i=0;i != pos;i++)
		{
			*temp++ = *stemp++;
		}
		for(i=0;i!=T.length;i++)
		{
			stemp++;
		}
		for(i=0;i!=V.length;i++)
		{
			*temp++ = *vtemp++;
		}
		while(*stemp)
		{
			*temp++ = *stemp++;
		}
		*temp='\0';
		delete Str.ch;
		Str.length = nlength;
		Str.ch  = temp;
		pos = Index(S,T,Pos+V.length);
	}
	printf("子串替代成功");
	return true;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值