字符串的基本操作--基于堆分配存储

字符串一般简称为串。

堆分配存储结构的串有顺序存储结构的特点,处理方便,操作中对串长又没有任何限制,更显灵活,因此选择堆分配存储串。

利用c语言实现字符串的基本操作(查找,替换,连接等):

c语言实现详细代码如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct
{
	char *ch;
	int length;
}HString;

//chars为字符串常量,生成一个其值等于chars的串
Status StrAssign(HString *t,char *chars)
{
	int i,j;
	char *c;
	if(t->ch)
	{
		free(t->ch);
	}
	for(i=0,c=chars;c[i]!='\0';i++)
	if(!i)
	{
		t->ch=NULL;
		t->length=0;
	}
	else
	{
		t->ch=(char *)malloc((i+1) * sizeof(char));
		if(!(t->ch))
		{
			exit(OVERFLOW);
		}
		for(j=0;j<=i;j++)
		{
			t->ch[j]=chars[j];
		}
		t->length=i+1;
	}
	return OK;
}

//销毁串
Status DestroyString(HString *s)
{
	free(s->ch);
	s->ch=NULL;
	s->length=0;
	return OK;
}

//打印输出串
void print(HString T)
{
	int i;
	for(i=0;i<T.length;i++)
	{
		printf("%c",T.ch[i]);
	}
	printf("\n");
}

//求串的长度
int StrLength(HString S)
{
	return S.length;
}

//清空串
Status ClearString(HString *s)
{
	if(s->ch)
	{
		free(s->ch);
		s->ch=NULL;
	}
	s->length=0;
	return OK;
}

//返回由S1和S2拼接成的新串
Status Concat(HString *t,HString S1,HString S2)
{
	int i;
	ClearString(t);
	t->ch=(char *)malloc((S1.length+S2.length) * sizeof(char));
	if(!(t->ch))
	{
		exit(OVERFLOW);
	}
	for(i=0;i<S1.length;i++)
	{
		t->ch[i]=S1.ch[i];
	}
	t->length=S1.length+S2.length;
	for(i=0;i<t->length;i++)
	{
		t->ch[S1.length+i]=S2.ch[i];
	}
	return OK;
}

//求子串
Status 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 ERROR;
	}
	if(sub->ch)
	{
		free(sub->ch);
	}
	if(!len)
	{
		sub->ch=NULL;
		sub->length=0;
	}
	else
	{
		sub->ch=(char *)malloc(len *sizeof(char));
		for(i=0;i<len;i++)
		{
			sub->ch[i]=S.ch[pos-1+i];
		}
		sub->length=len;
	}
	return OK;
}

//串的比较
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;
}

//返回主串中第pos个字符之后对一次出现的位置
int Index(HString S,HString T,int pos)
{
	int i,m,n;
	HString Sub;
	HString *sub=⋐
	Sub.ch=NULL;
	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;
}

//在串的第pos个字符之前插入串T
Status StrInsert(HString *s,int pos,HString T)
{
	int i;
	if(pos<1||pos>s->length+1)
	{
		return ERROR;
	}
	if(T.length)
	{
		s->ch=(char *)realloc(s->ch,(s->length+T.length) * sizeof(char));
		if(!s->ch)
		{
			exit(OVERFLOW);
		}
		for(i=s->length-1;i>=pos-1;--i)
		{
			s->ch[i+T.length]=s->ch[i];
		}
		for(i=0;i<=T.length-1;i++)
		{
			s->ch[pos-1+i]=T.ch[i];
		}
		s->length+=T.length;
	}
	return OK;
}

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

//用V替换主串S中出现的所有与T相等的不重叠的子串
Status Replace(HString *s,HString T,HString V)
{
	int n,d;
	n=StrLength(T);
	do
	{
		d=Index(*s,T,1);
		StrDelete(s,d,n);
		StrInsert(s,d,V);
	}while(Index(*s,T,1));
	return OK;
}

//主函数
void main()
{
	//int i;
	HString S,S1,S2,S3,T,U,V,W,*s;
	//ClearString(s);
	S.ch=NULL;
	S1.ch=NULL;
	S2.ch=NULL;
	S3.ch=NULL;
	T.ch=NULL;
	U.ch=NULL;
	V.ch=NULL;
	W.ch=NULL;
	s=&S1;
	StrAssign(s,"THIS IS A BOOK");
	s=&S2;
	StrAssign(s,"ESE ARE");
	s=&U;
	StrAssign(s,"XYXYXYXYXYXY");
	s=&S;
	StrAssign(s,"S");
	s=&W;
	StrAssign(s,"W");
	s=&S3;
	SubString(s,S1,3,7);
	s=&V;
	SubString(s,U,6,3);
	//s=&T;
	printf("S1=");print(S1);
	printf("S2=");print(S2);
	printf("U=");print(U);
	printf("S=");print(S);
	printf("W=");print(W);
	printf("S3=");print(S3);
	printf("V=");print(V);
	//Concat(s,S1,S);
	Replace(s,S3,S2);
	s=&U;
	Replace(s,V,W);
	printf("S1=");
	print(S1);
	printf("T=");
	print(T);
	printf("U=");
	print(U);
	/*
	DestroyString(&S);
	DestroyString(&S1);
	DestroyString(&S2);
	DestroyString(&S3);
	DestroyString(&T);
	DestroyString(&U);
	DestroyString(&V);
	DestroyString(&W);*/
}

得到的结果如下图所示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值