串的堆分配存储表示

一、代码如下



/*
项目名称:串的堆分配存储表示

编译环境:VC++ 2008

作者相关:。。。

最后修改:2019.10.01

学习目标:赋值、复制、判空、比较、求长、清空、连接、返回子串、
返回子串下标、替换子串、插入字串

注意事项:1.测试所有功能是否正常

2.SubString函数中len最大值为StrLength(S)-pos+1
例:12345,长度为5,即5-1+1=5
*/

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

#define  ERROR    0
#define  OK       1
#define  TRUE     true
#define  FALSE    false

typedef  bool     Status;

typedef  struct{

	char *ch;//非空串按串长分配存储区,否则ch为NULL
	int  length;

}HString;

Status  InitStr(HString &T);

Status  StrAssign(HString &T,char* chars);//chars表示字符串

Status  StrCopy(HString &T,HString S);//将串S复制给串T

Status  StrEmpty(HString S);

int     CharsLength(char *chars);

int     StrLength(HString S);

int     StrCompare(HString S,HString T);//S>T,返回值>0,以此类推

Status  ClearString(HString &S);//清空串并释放空间

Status  Concat(HString &T,HString S1,HString S2);//T返回S1,S2连接而成的新串

Status  SubString(HString &Sub,HString S,int pos,int len);//返回串S的第pos个字符起长度为len的字串

int     Index(HString S,HString T,int pos);//返回字串在主串pos之后第一次出现的位置

Status  Replace(HString &S,HString T,HString V);//V替换S中与T相等不重叠的字串

Status  StrInsert(HString &S,int pos,HString T);//在S第pos个字符之前插入T

Status StrOut(HString S);

int main()
{
	//定义变量及初始化   
	HString S,T1,T2,Sub,V;

	InitStr(S);
	InitStr(T1);
	InitStr(T2);
	InitStr(Sub);
	InitStr(V);

	char chars[]="12345";
	char chars1[]="123456";
	char chars2[]="abcd";
	//赋值操作
	StrAssign(T1,chars);
	printf("赋值后T1");
	StrOut(T1);
	//复制操作	
	StrCopy(S,T1);
	printf("复制后S");
	StrOut(S);
	//比较操作
	StrAssign(T1,chars1);
	printf("赋值后T1");
	StrOut(T1);
	int result=StrCompare(T1,S);
	printf("串S,T1比较结果:");
	if(result==0)
		printf("T1==S\n\n");
	else if(result>0)
		printf("T1>S\n\n");
	else
		printf("T1<S\n\n");
	//连接操作
	StrAssign(T2,chars);
	printf("赋值后T2");
	StrOut(T2);
	Concat(S,T1,T2);
	printf("T1与T2连接后S");
	StrOut(S);
	//截取字串操作
	SubString(Sub,S,3,4);
	printf("S串返回的起点为3,长度为4的Sub");
	StrOut(Sub);
	//返回字串在主串制定pos后第一次出现的位置
	StrCopy(T1,Sub);
	printf("复制后T1");
	StrOut(T1);
	int location=Index(S,T1,1);
	printf("字串在主串pos=1之后第一次出现的位置为:%d\n\n",location);
	//替换操作
	StrAssign(V,chars2);
	printf("赋值后V");
	StrOut(V);
	printf("T1");
	StrOut(T1);
	Replace(S,T1,V);
	printf("V替换T1后S");
	StrOut(S);
	//插入操作
	StrInsert(S,1,V);
	printf("在第一个位置前插入V串的S");
	StrOut(S);

	return 0;
}


Status  InitStr(HString &T)
{
	T.ch=NULL;
	T.length=0;

	return OK;
}

Status  StrAssign(HString &T,char* chars)//源代码里要求的是长度,不是字节
{
	int k = CharsLength(chars);

	if(T.ch) free(T.ch);//复制之前释放T串

	if(!k)
	{
		T.ch=NULL;
		T.length=0;
	}
	else
	{
		T.ch = (char*)malloc(k*sizeof(char));
		T.length = k;
		for(int i=0;i<k;i++)
			T.ch[i] = chars[i];
	}
	return OK;
}

Status  StrCopy(HString &T,HString S)
{
	if(!S.ch)
		return ERROR;
	if(T.ch)
	{
		free(T.ch);
		T.ch=NULL;
		T.length=0;
	}
	T.ch=(char*)malloc(S.length*sizeof(char));
	for(int i=0;i<S.length;i++)
		T.ch[i]=S.ch[i];
	T.length=S.length;

	return OK;
}

Status  StrEmpty(HString S)
{
	if(!S.length)
		return TRUE;
	else
		return FALSE;

}

int   CharsLength(char *chars)
{
	return strlen(chars);
}

int  StrLength(HString S)
{
	return S.length;
}

int  StrCompare(HString S,HString 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;//若比较的字符全部相等的话
}

Status  ClearString(HString &S)
{
	if(S.ch)
	{
		free(S.ch);
		S.ch=NULL;
	}
	S.length=0;

	return OK;
}

Status  Concat(HString &T,HString S1,HString S2)
{
	if(T.ch)
	{
		free(T.ch);
		T.ch=NULL;
		T.length=0;
	}
	int SumLength=S1.length+S2.length;
	T.ch=(char *)malloc(SumLength*sizeof(char));
	for(int i=0;i<S1.length;i++)
		T.ch[i]=S1.ch[i];
	for(int i=S1.length;i<SumLength;++i)
		T.ch[i]=S2.ch[i-S1.length];

	T.length=SumLength;

	return OK;

}
Status SubString(HString &Sub,HString S,int pos,int len)
{
	if(pos<1||pos>StrLength(S)||len<0||len>StrLength(S)-pos+1)
		return ERROR;
	if(Sub.ch)
		free(Sub.ch);
	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[i+pos-1];
		Sub.length=len;
	}
	return OK;

}

int Index(HString S,HString T,int pos)
{
	HString Sub;
	InitStr(Sub);

	if(pos<=0)
		return ERROR;

	int n=StrLength(S);
	int m=StrLength(T);

	int i=pos;

	while(i<=n-m+1)
	{
		SubString(Sub,S,i,m);//这里误把i写成pos
		if(StrCompare(Sub,T)!=0)
			++i;
		else
			return i;
	}

	return 0;

}

Status  Replace(HString &S,HString T,HString V)//默认串V和T长度相同
{
	if(!S.ch||!T.ch||!V.ch)//存在串不存在
		return ERROR;

	int n=StrLength(S);
	int m=StrLength(T);
	int i=1,j=0;
	HString Sub;
	InitStr(Sub);

	while(i<=n-m+1)
	{
		SubString(Sub,S,i,m);
		if(!StrCompare(Sub,T))
		{
			int k=i-1;
			while(j<m)
			{
				S.ch[k]=V.ch[j];
				++k;
				++j;
			}

		}
		++i;

	}

	return OK;
}

Status  StrInsert(HString &S,int pos,HString T)
{
	if(pos<1||pos>S.length+1)
		return ERROR;
	if(!StrEmpty(T))
	{
		if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))
			return ERROR;
	}
	for(int i=S.length-1;i>=pos-1;--i)//pos之后(包括pos)后移T.length个单位
		S.ch[i+T.length]=S.ch[i];     //这样pos之前腾出T.length个空间
	for(int j=0;j<T.length;++j)//插入T
		S.ch[pos-1+j]=T.ch[j];

	S.length+=T.length;

	return OK;
}

Status StrOut(HString S)
{
	printf("串内容: ");
	for(int i=0;i<S.length;i++)
	{
		printf("%c",S.ch[i]);
	}
	printf("\n\n");
	return OK;
}

二、运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值