数据结构之串

串的堆分配表示

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct{
	char *ch;
	int length;
}HString;

/* 初始化(产生空串)字符串T。另加 */
void InitString(HString *T)
{ 
	(*T).length=0;
	(*T).ch=NULL;
}

/* 生成一个其值等于串常量chars的串T */
int StrAssign(HString *T,char *chars)
{ 
	int i,j;
	if((*T).ch)
		free((*T).ch); /* 释放T原有空间 */
	i=strlen(chars); /* 求chars的长度i */
	if(!i)
	{ /* chars的长度为0 */
		(*T).ch=NULL;
		(*T).length=0;
	}
	else
	{ /* chars的长度不为0 */
		(*T).ch=(char*)malloc(i*sizeof(char)); /* 分配串空间 */
		if(!(*T).ch) /* 分配串空间失败 */
			exit(1);
		for(j=0;j<i;j++) /* 拷贝串 */
			(*T).ch[j]=chars[j];
		(*T).length=i;
	}
	return 1;
}

/* 初始条件:串S存在。操作结果: 由串S复制得串T */
int StrCopy(HString *T,HString S)
{
	if(T->ch)
		free(T->ch);
	T->length=S.length;
	T->ch=(char *)malloc(T->length*sizeof(char));
	int i;
	for(i=0;i<T->length;i++)
		T->ch[i]=S.ch[i];
	return 1;

}
void StrPrint(HString T)
{ /* 输出T字符串。另加 */
	int i;
	for(i=0;i<T.length;i++)
		printf("%c",T.ch[i]);
	printf("\n");
}

/* 初始条件: 串S存在。操作结果: 若S为空串,则返回TRUE,否则返回FALSE */
int StrEmpty(HString S)
{
	if(S.length==0 && S.ch==NULL)
		return 1;
	return 0;
}
/* 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */
int StrCompare(HString S,HString T)
{
	int i;
	for(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;
}

/* 返回S的元素个数,称为串的长度 */
int StrLength(HString S)
{ 
   return S.length;
}

int ClearString(HString *S)
{ /* 将S清为空串 */
   if((*S).ch)
   {
     free((*S).ch);
     (*S).ch=NULL;
   }
   (*S).length=0;
   return 1;
 }
 /* 用T返回由S1和S2联接而成的新串 */
int Concat(HString *T,HString S1,HString S2)
{
	if(T->ch)
		free(T->ch);
	T->ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
	int i;
	for(i=0;i!=S1.length;i++)
		T->ch[i]=S1.ch[i];
	for(i=S1.length;i!=S1.length+S2.length;i++)
		T->ch[i]=S2.ch[i-S1.length];
	T->length=S1.length+S2.length;
	return 1;
}
/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
   /* 其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1 */
int SubString(HString *Sub, HString S,int pos,int len)
{
   int i;
   if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
	   return 0;
   if(Sub->ch)
	   free(Sub->ch);
   if(!len) /* 空子串 */
   {
		(*Sub).ch=NULL;
		(*Sub).length=0;
   }else{
	   /* 完整子串 */
		Sub->ch=(char *)malloc(len*sizeof(char));
		for(i=pos-1;i!=pos+len-1;i++)
			Sub->ch[i-pos+1]=S.ch[i];   
		 Sub->length=len;
   }
   return 1;
}

/* T为非空串。若主串S中第pos个字符之后存在与T相等的子串, */
/* 则返回第一个这样的子串在S中的位置,否则返回0 */
int Index(HString S,HString T,int pos) /* 算法4.1 */
{
	int n,m,i;
	HString sub;
	InitString(&sub);
	if(pos>0)
	{
		n=StrLength(S);
		m=StrLength(T);
		i=pos;
		while(i<=n-m+1)
		{
			SubString(&sub,S,i,m);
			if(StrCompare(sub,T)!=0)
				++i;
			else
				return i;
		}
	}
   return 0;
}

/* 1≤pos≤StrLength(S)+1。在串S的第pos个字符之前插入串T */
int StrInsert(HString *S,int pos,HString T) /* 算法4.4 */
{ 
   int i;
   if(pos<1||pos>(*S).length+1) /* pos不合法 */
	   return 0;
   if(T.length) /* T非空,则重新分配空间,插入T */
   {
	   (*S).ch=(char*)realloc((*S).ch,((*S).length+T.length)*sizeof(char));
	   if(!(*S).ch)
		   exit(1);
	   for(i=(*S).length-1;i>=pos-1;--i) /* 为插入T而腾出位置 */
		   (*S).ch[i+T.length]=(*S).ch[i];
	   for(i=0;i<T.length;i++)
		   (*S).ch[pos-1+i]=T.ch[i]; /* 插入T */
	   (*S).length+=T.length;
   }
   return 1;
 }

/* 从串S中删除第pos个字符起长度为len的子串 */
int StrDelete(HString *S,int pos,int len)
{ 
	if(pos<1 || pos>S->length || pos+len-1>S->length)
		return 0;
	int i;
	for(i=pos+len-1;i!=S->length;i++)
		S->ch[i-len]=S->ch[i];
	(*S).length-=len;
	(*S).ch=(char*)realloc((*S).ch,(*S).length*sizeof(char));
	return 1;
}

/* 初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */
/* 操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */
int Replace(HString *S,HString T,HString V)
{
	int i=1;
	if(StrEmpty(T))
		return 0;
	do{
		i=Index(*S,T,i);
		if(i)
		{
			StrDelete(S,i,T.length);
			StrInsert(S,i,V);
			i=i+V.length;
		}
	}while(i);
	return 1;
}
int main(){
	HString s1;
	InitString(&s1);
	StrAssign(&s1,"Hello World");
	StrPrint(s1);

	HString s2;
	InitString(&s2);
	StrAssign(&s2,"prince");
	StrPrint(s2);

	StrCopy(&s1,s2);
	StrPrint(s1);

	//printf("%d\n",StrCompare(s1,s2));
	HString s3;
	InitString(&s3);
	Concat(&s3,s1,s2);
	StrPrint(s3);

	//SubString(&s1,s3,5,3);
	//StrPrint(s1);
//	StrDelete(&s3,5,3);
//	StrPrint(s3);

	StrAssign(&s1,"in");
	StrAssign(&s2,"++");
	Replace(&s3,s1,s2);
	StrPrint(s3);
	return 0;
}

串的块链存储表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值