串的堆分配存储

串的堆分配存储表示 方法仍然以一组地址连续的存储单元表示,但它们的存储
空间是在程序执行过程中动态分配的。

堆串类型定义
typedef strcut HString
{
 char *ch; //若是非空串,则按串长分配存储区,否则ch为NULL
 int length; //串的长度
}HString;

堆串常用基本操作的算法描述

串赋值
int StrAssign(HString &S, char *chars)
{
 int i = 0, j;
 if (S.ch != NULL)
  free(S.ch);
 while (chars[i] != '\0')
  i++;
 if (!i)
 {
  S.ch = NULL;
  S.length = 0;
 }
 else
 {
  if (!(S.ch = (char *)malloc(i*sizeof(char))))
   exit(OVERFLOW);
  for (j=0; j<i; j++)
   S.ch[j] = chars[j];
  S.length = i;
 }
 return OK;
}

串清空
int ClearString(HString &S)
{
 if (S.ch)
 {
  free(S.ch);
  S.ch = NULL;
 }
 S.length = 0;
 return OK;
}

求串长
int StrLength(HString &S)
{
 return (S.length);
}

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

串插入
int StrInsert(HString &S, int pos, HString T)
{
 int i;
 if (pos<1 || pos>S.length+1)
  return ERROR;
 if (T.length)
 {
  if (!(S.ch = (char*)realloc(S.ch, (S.length+T.length)*sizeof(char))))  
   exit(OVERFLOW);
  for (i=S.length; i>=pos; i--)
   S.ch[T.length+i] = S.ch[i];
  for(i=1; i<=T.length; i++)
   S.ch[pos-1+i] = T.ch[i];
  S.length = S.length + T.length;
 }
 retur OK;
}

串连接
int Concat(HString &T, HString S1, HString S2)
{
 int i;
 if (T.ch)
  free(T.ch);
 if (!(T.ch = (char*)malloc((S1.length+S2.length)*sizeof(char))))
  exit(OWERFLOW);
 T.length = S1.length+S2.length;
 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] = S2.ch[i];
 return OK;
}

求子串
int SubString(HString &sub, HString S, int pos, int len)
{
 int i;
 if (pos<1 || pos>S.length || len<0 || len>length-pos+1)
  return ERROR;
 if (sub.ch)
  free(sub.ch);
 if (!len)
 {
  sub.ch = NULL;
  sub.length = 0;
 }
 else
 {
  sub.ch = (char*)mallco(len*sizeof(char));
  if (sub.ch == NULL)
   exit(OWERFLOW);
  for (i=0; i<len; i++)
   sub.ch[i] = S.ch[pos+i];
  sub.length = len;   
 }
 return OK;
}

 

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

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

int SubString(HString &sub, HString S, int pos, int len)
{
	int i;
	if (pos<0 || pos>S.length || len>S.length-pos+1)
		return 1;
	if (sub.ch)
		free(sub.ch);
	if (!len)
	{
		sub.ch = NULL;
		sub.length = 0;
	}
	else
	{
		sub.ch = (char*)malloc(len*sizeof(char));
		if (sub.ch == NULL)
			exit(1);
		for (i=0; i<len; i++)
			sub.ch[i] = S.ch[pos+i];
		sub.length = len;
	}
	return 0;
}

int main(void)
{
	int i;
	HString S, sub;
	S.ch = "helloworld!";
	S.length = 11;
	sub.ch = NULL;
	sub.length = 0;
	SubString(sub, S, 5, 5);
	for (i=0; i<5; i++)
		printf("%c", sub.ch[i]);
	printf("\n");
	return 0;
}


 

 

转载于:https://www.cnblogs.com/zm001/archive/2012/12/01/2875485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值