一步一步复习数据结构和算法基础-堆分配存储表示串

本文探讨了在数据结构中,如何通过堆分配存储来优化串操作,特别是当串长度超过固定上界255时,如何使用动态分配来避免截断问题。堆分配存储的串操作包括字符序列的复制、插入和置换等,旨在提高效率并解决长度受限的挑战。
摘要由CSDN通过智能技术生成

  在顺序存储结构中,实现串操作的元操作是“字符序列的复制”,操作的时间复杂度基于复制的字符序列的长度。

这个操作的特点就是如果操作中串的长度超过上界即 255 的时候就要进行截断处理,而且这个现象在串的其他

操作如插入、置换中也可能发生,克服这个弊病的方法唯有动态分配串的长度。


堆分配存储表示串基于这个思想:

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

在上面的结构体中 ch是字符串指针,可以根据需要开辟相应的空间,而且可以很方便的销毁。

下面就是部分基于堆分配存储表示串的操作:

#include<stdio.h>
#include<stdlib.h>
#define maxstrlen 255
typedef struct
{
	char *ch;
	int length;
}HString;


int StrAssign(HString *T,char *chars)
{
	int i,k;
	if((*T).ch)free((*T).ch);

	i = strlen(chars);		

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

void StrPrint(HString T)
{
	int i;
	for(i=0;i<T.length;i++)
		printf("%c",T.ch[i]);
	printf("\n");
}

//串比较:大于0 串S大于T 等于0 两串相等 小于0 串S小于T
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;
}

//销毁串T
int ClearStr(HString *T)
{
	if(!(*T).ch){free((*T).ch);(*T).ch=NULL;}
	(*T).length = 0;
	return 1;
}

//连接串t1和t2
int StrConcat(HString *T,HString t1,HString t2)
{
	int i,k;
	if((*T).ch)free((*T).ch);
	if(!((*T).ch = (char*)malloc(sizeof(char)*(t1.length + t2.length))))
		exit(1);
	
	(*T).length = t1.length + t2.length;
	for(i=0,k=0;i<t1.length;i++,k++)
		(*T).ch[k] = t1.ch[i];
	for(i=0;i<t2.length;i++,k++)
		(*T).ch[k]=t2.ch[i];

	return 1;
}

//主串中获取字串
int SubString(HString *sub,HString T,int pos,int len)
{
	int i;
	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(sizeof(char)*len);
		for(i=0;i<len;i++)
			(*sub).ch[i] = T.ch[pos+i];
		(*sub).length = len;
	}
	return 1;
}

int main()
{
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值