数据结构中串的C语言实现--堆分配存储表示(部分方法)

数据结构中串(字符串)的堆分配存储表示:结构体:

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

ch用来存储申请的空间首地址,length用来存储申请到的地址大小即字符串的长度。
字符串的初始化函数:

Status StrAssign(HString *t,char *chars){
	char *c=chars;
	int i;
	for(i=0,c;*c;++i,++c);//*c可以替换为*c!='\0' 
	if(!i){
		t->ch=NULL;
		t->length=0;
	}else{
		if(!(t->ch=(char*)malloc(i*sizeof(char)))){
			exit(1);
		}
		for(int j=0;j<i;j++){
			t->ch[j]=chars[j];
		}
		t->length=i;
	}
	return OK;
}

字符串的遍历函数:

void StrTraverse(HString *t){
	for(int i=0;i<t->length;i++){
		printf("%c",t->ch[i]);
	}
}

一些常用函数的实现:

#include<stdio.h>
#include<stdlib.h>
#define MAX 255
#define OK 1

typedef int Status;

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

int main(){
	Status StrAssign(HString *,char *);
	int StrLength(HString *);
	void StrTraverse(HString *);
	Status StrCopy(HString *,HString *);
	Status StrEmpty(HString *);
	Status StrCompare(HString *,HString *);
	Status ClearString(HString *);
	Status Concat(HString *,HString *,HString *);
	Status SubString(HString *,HString *,int ,int );
	
	char a[20]="hello string world";
	HString s,p,m,sub,*sp=&s,*pp=&p,*mp=&m,*subp=&sub;
	StrAssign(sp,a);
	StrCopy(pp,sp);
	printf("%d\n",StrLength(pp));
	StrTraverse(pp);
	if(StrCompare(sp,pp)==0){
		printf("\ns与p两个字符串相等\n");
	}
	Concat(mp,sp,pp);
	StrTraverse(mp);
	SubString(subp,mp,2,9);
	printf("\n");
	StrTraverse(subp);
	return 0;
}

Status StrAssign(HString *t,char *chars){
	char *c=chars;
	int i;
	for(i=0,c;*c;++i,++c);//*c可以替换为*c!='\0' 
	if(!i){
		t->ch=NULL;
		t->length=0;
	}else{
		if(!(t->ch=(char*)malloc(i*sizeof(char)))){
			exit(1);
		}
		for(int j=0;j<i;j++){
			t->ch[j]=chars[j];
		}
		t->length=i;
	}
	return OK;
}

int StrLength(HString *t){
	return t->length;
}

void StrTraverse(HString *t){
	for(int i=0;i<t->length;i++){
		printf("%c",t->ch[i]);
	}
}

Status StrCopy(HString *t,HString *p){
	t->length=p->length;
	t->ch=(char*)malloc(t->length*sizeof(char));
	if(!t->ch){
		exit(1); 
	}
	for(int i=0;i<t->length;i++){
		t->ch[i]=p->ch[i];
	}
	return OK;
}

Status StrEmpty(HString *t){
	if(t->length==0){
		return 1;
	}else{
		return 0;
	}
}

Status StrCompare(HString *t,HString *p){
	for(int i=0;i<t->length&&i<p->length;++i){
		if(t->ch[i]!=p->ch[i]){
			return t->ch[i]-p->ch[i];
		}
	}
	return t->length-p->length;
}

Status ClearString(HString *t){
	if(t->ch){
		free(t->ch);
		t->ch=NULL;
	}
	t->length=0;
	return OK;
}

Status Concat(HString *t,HString *s1,HString *s2){
	t->ch=(char*)malloc((s1->length+s2->length)*sizeof(char));
	if(!t->ch){
		exit(1);
	}
	for(int i=0;i<s1->length;i++){
		t->ch[i]=s1->ch[i];
	}
	t->length=s1->length+s2->length;
	for(int j=0;j<s2->length;j++){
		t->ch[s1->length+j]=s2->ch[j];
	}
	return OK;
}

Status SubString(HString *sub,HString *t,int pos,int len){
	if(pos<1||pos>t->length||len<0||len>t->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(int i=0;i<len;i++){
			sub->ch[i]=t->ch[pos-1+i];
		}
		sub->length=len;
	}
	return OK;
}
----------------------------------------------------------------
运行结果:
18
hello string world
s与p两个字符串相等
hello string worldhello string world
ello stri
--------------------------------
Process exited after 0.1562 seconds with return value 0
请按任意键继续. . .
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KOKO银角大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值