数据结构之“串”的概念及基本操作

文章目录:

  • 串的相关概念
  • 串的常用基本操作

1.串的概念和相关术语

在这里插入图片描述

在这里插入图片描述

2.串的基本操作

在这里插入图片描述

在这里插入图片描述

  • 赋值操作
 //赋值操作
  
 int strassign(String &str,char *ch)
 {
 	//if(str.ch)
 	   //free(str.ch);//释放原串空间 
 	int len=0;
 	char *c=ch;
 	while(*c)//求ch串的长度 
 	{
 		++len;
 		++c;
	 }
	 if(len==0)//如果ch为空串,则直接返回空串 
	 {
	 	str.ch==NULL;
		str.length=0;
		 return 1; 
	 }
	 else
	 {
	 	str.ch=(char*)malloc(sizeof(char)*(len+1));//取len+1是为了多分配一个空间存放'\0'字符
		 if(str.ch=NULL)
		   return 0; 
		 else
		 {
		 	c=ch;
		 	for(int i=0;i<=len;++i,++c)
		 	    str.ch[i]=*c;
		 	str.length=len;
		 	return 1;
		 }
	 }
 }
  • 取串的长度
//取串长度 
 int strlength(String str)
 {
 	return str.length;
 }
  • 串的比较
//串比较
 int strcompare(String s1,String s2) 
 {
 	for(int i=0;i<s1.length && i<s2.length;++i)
 	   if(s1.ch[i]!=s2.ch[i])
 	      return s1.ch[i]-s2.ch[i];
 	return s1.length-s2.length;
 }
  • 串的连接
//串连接
 int concat(String &str,String str1,String str2)
  {
  /*	if(str.ch)
  	{
  		free(str.ch);
		str.ch=NULL; 
	  }*/
	  
	str.ch=(char*)malloc(sizeof(char)*(str1.length+str2.length+1));
	if(str.ch==NULL)
	  return 0;
	int i=0;
	while(i<str1.length)
	{
		str.ch[i]=str1.ch[i];
		++i;
	}
	int j=0;
	while(j<=str2.length)
	{
		str.ch[i+j]=str2.ch[j];
		++j;
	}
	str.length=str1.length+str2.length;
	return 1; 
  }
  • 求子串
int substring(String &substr,String str,int pos,int len)
   {
   	if(pos<0||pos>=str.length||len<0||len>str.length-pos)
   	  return 0;
   	if(len==0)
   	{
   		substr.ch=NULL;
   		substr.length=0;
   		return 1;
	   }
	else
	{
		substr.ch=(char*)malloc(sizeof(char)*(len+1));
		int i=pos;
		int j=0;
		while(i<pos+len)
		{
			substr.ch[j]=str.ch[i];
			++i;
			++j;
		}
		substr.ch[j]='\0';
		substr.length=len;
		return 1;
		
	}
   }
  • 串清空
//串清空
    int clearstring(String &str)
    {
    	if(str.ch)
    	{
    		free(str.ch);
    		str.ch=NULL;
		}
		str.length=0;
		return 1;
	}
  • 完整代码
#include<stdio.h>
//#include<iostream>
#include<stdlib.h>
#include<malloc.h> 
//using namespace std;
 
 
typedef struct{
	char *ch;
	int length;
}HString;
 
 
//为串分配空间、赋值
int StrAssign(HString &T,char *chars){
	int i;
//	if(T.ch)free(T.ch);					//释放T原有空间 【1】 
	char *c=chars;
	for(i=0;*c!='\0';++i,++c);		//求chars的长度i
	if(!i){
		T.ch=NULL;
		T.length=0;
	}else{
		if(!(T.ch=(char*)malloc(i*sizeof(char))))return 0;	//分配空间的同时判断是否成功分配 
		for(int j=0;j<i;j++)
			T.ch[j]=chars[j];
		T.length=i;
	}
	
	return 1;
}
 
 
//求长度
int StrLength(HString S){
	return S.length;
} 
 
 
//字符串比较
int StrCompare(HString S,HString T){
	//规则:若S>T,则返回值>0,若S=T,则返回值=0,若S<T,则返回值<0
	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;
} 
 
 
int ClearString(HString &S){
	//将S清为空串
	if(S.ch){
		free(S.ch);
		S.ch=NULL;
	} 
	S.length=0;
	return 1;
}
 
int SubString(HString &Sub,HString S,int pos,int len){
	//用Sub返回串S的第pos个字符起长度为len的子串 
	//1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1 
 
	if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
		return 0;
			
//	if(Sub.ch)free(Sub.ch);			//【2】 
	if(!len){
		Sub.ch=NULL;
		Sub.length=0;
	}else{
		Sub.ch=(char*)malloc(len*sizeof(char));
		for(int i=0;i<len;i++)
			Sub.ch[i]=S.ch[pos-1+i];
		Sub.length=len;
	}
	return 1;
}
 
int Concat(HString &T,HString S1,HString S2){
	//用T返回由S1和S2连接而成的新串ksckslm
//	if(T.ch)free(T.ch);
 
	T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char));
//	if(!()); 
//		return 0;
	for(int i=0;i<S1.length;i++){ 
 
		T.ch[i]=S1.ch[i];
	} 
	T.length=S1.length+S2.length;
	for(int i=0;i<S2.length;i++){
		T.ch[S1.length+i]=S2.ch[i];
	}
	return 1;
}
 
 
int main(){
	int res;
	HString str1,str2,str3,str4;
	int l1,l2;
	
	char s1[5];
	char s2[5];
	
	scanf("%s%s",s1,s2);
	StrAssign(str1,s1);
	StrAssign(str2,s2);
	printf("%s\n",str1.ch);
	printf("%s\n",str2.ch);
	
	
	res=StrCompare(str1,str2);
	printf("%d\n",res); 
	
	SubString(str3,str1,1,3);
	printf("%s\n",str3.ch);
 
	Concat(str4,str1,str2);
 
	printf("%s\n",str4.ch);
	
//	ClearString(str);
//	printf("清空后:\n"); 
//	printf("%s\n",str.ch);
	return 0;
}

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值