数据结构 堆分配表示的串

#include<stdio.h>
#include<stdlib.h>
#define Status int
#define TRUE 1
#define FALSE 0

typedef  struct{
	char *ch;	//分配堆空间首地址 
	int length;	//串长 
}HString; 


//用字符串常量初始化S 
int StrAssign(HString *S, const char *chars)
{
	int i=0,j;
	const char *c=chars;
	while(*c)
	{
		++i;
		c++;
	}
	if(!i)
	{
		S->ch=NULL;
		S->length=0;
	} 
	else
	{
		S->ch=(char *)malloc(i*sizeof(char));
		if(!S->ch)return 0;
		for(j=0;j<i;j++)
		{
			S->ch[j]=chars[j];
		}
	}
	S->length=i;
	return 1;
}
//用变量初始化S 
int StrAssign(HString *S,  char *chars)
{
	int i=0,j;
	char *c=chars;
	
	while(*c)	//求chars的长度i
	{
		i++,c++;
	}		
	if(i==0)
	{
		S->ch=NULL,S->length=0;
	}
	else
	{
		S->ch=(char *)malloc(i*sizeof(char));
		if(!S->ch)return 0;
		for(j=0;j<i;j++)
			S->ch[j]=chars[j];
	}
	S->length=i;
	return 1;
}
//比较串S和串T,S>T返回值>0,相等返回0,S<T返回值小于0 
int StrCompare(HString S,HString T)
{
	int len,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的第pos个字符起长度为len的子串 
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;
	Sub->ch=(char*)malloc(len*sizeof(char));
	if(!Sub->ch)	return 0;
	for(i=0;i<len;i++)
		Sub->ch[i]=S.ch[pos+i];
	Sub->length=len;
	return 1;
}
//用T返回S1和S2组成的字符串 
int Concat(HString *T,HString S1,HString S2) 
{
	int i;
	T->ch=(char*)malloc((S1.length+S2.length)*sizeof(char));
	if(!T->ch)return 0;
	for(i=0;i<S1.length;i++)
	{
		T->ch[i]=S1.ch[i];
	}
	for(i=0;i<S2.length;i++)
	{
		T->ch[S1.length+i]=S1.ch[i];
	}
	T->length=S1.length+S2.length;
	return 1;
}
void StrDisplay(HString S)
{
	int i;
	for(i=0;i<S.length;i++)
	{
		printf("%c",S.ch[i]);
	}
}
//求串的长度 
int StrLength(HString S){
	return S.length;
}
//清空串
int ClearString(HString *S){
	if(S->ch)
	{
		free(S->ch);
		S->ch=NULL;
	}
	S->length=0;
	return 1;
} 
//在串的第pos个字符之前插入串T,即pos位开始元素往后移动
int StrInsert(HString *S,int pos,HString T){
int i;
if(pos<1 || pos>S->length+1)
	return 0;
if(T.length){
	if(!(S->ch=(char*)realloc(S->ch,(S->length+T.length)*sizeof(char))))
		return 0;
	for(i=S->length-1;i>=pos-1;--i)
		S->ch[i+T.length]=S->ch[i];
	for(i=0;i<T.length;i++)
		S->ch[i+pos-1]=T.ch[i];
	S->length+=T.length;
}
return 1;
}
    int main()
    {
    	HString S1,S2,T;
    	StrAssign(&S1,"Monkey King") ;
    	StrAssign(&S2,"Monkey ") ;
    	StrDisplay(S1);
    	printf("\n");
    	printf("%d",StrCompare(S1,S2));
    	printf("\n");
    	Concat(&T,S1,S2);
    	StrDisplay(T);
    	printf("\n");
    	int s = StrLength(S1);
    	printf("%d\n",s); // 求串长 
    	ClearString(&S1);
    	printf("\n");
    	printf("我来查看一下清空后的S1的值:");
    	StrDisplay(S1);

	/*
	StrAssign(&S1,"Monkey King") ;
	StrAssign(&S2,"Monkey ") ;
	printf("\n我来向S1中插入一个串S2:");
	printf("\n");
	StrInsert(&S1,3,S2);
	printf("\n");
	StrDisplay(S2);
	printf("\n");
	StrDisplay(S1);*/
	return 0;
}

在这里插入图片描述
注意:如果ClearString中的引用ch使用了’.’,则会报错
在这里插入图片描述
在这里插入图片描述
则此处需要使用‘->’来引用成员ch ,即:S->ch;
如果非指针类型的“HString”变量用‘->’来引用成员,则会报错
在这里插入图片描述
在这里插入图片描述
则对于非指针类型‘HString’引用结构成员的时候,只能用‘.’

最下面注释的那一段的运行结果
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值