串的堆分配存储表示

串的堆分配存储表示

前言
1、定长顺序存储结构和堆分配存储结构都是顺序存储结构,它们的主要区别是前者的串长是固定的,后者的串长是动态
2、串的定长顺序存储结构的缺点是限定了串的长度,若超出长度则约定截断
3、堆分配存储表示解决上面的问题,它动态分配串值得存储空间
4、串值共享的存储空间称之为,它由C语言的动态分配函数malloc和free管理

一、该结构最小操作子集代码实现如下

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

/************************************************************************/
/* 串的堆分配存储表示                                                   */
/************************************************************************/
typedef struct{
	char *ch;//按照需要分配内存
	int length;//串长度
}HString;

/*赋值*/
bool StrAssign(HString &T,char *chars)
{
	//求chars长度
	int charsLen;
	char *c;
	for (charsLen=0,c=chars;*c;charsLen++,c++);
	if (!charsLen)
	{
		T.ch=NULL;
		T.length=0;
	}
	else
	{
		//分配所需空间
		T.ch=(char*)malloc(sizeof(char)*charsLen);
		if (!T.ch)
		{
			return false;
		}
		int tempi=0;
		char *head=T.ch;
		do 
		{
			tempi++;
			*T.ch=*chars;
			T.ch++;
			chars++;

		} while(tempi!=charsLen);
		T.ch=head;
		T.length=charsLen;
		return true;
	}
}
/*求串长*/
int StrLength(HString S)
{
	return S.length;
}
/*串比较 S>T返回>0 S=T返回=0 S<T 返回<0*/
int StrCompare(HString S,HString T)
{
	for(int 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;
}
/*清空串*/
bool StrClear(HString &S)
{
	if(S.ch)
	{
		free(S.ch);
		S.ch=NULL;
	}
	S.length=0;
	return true;
}
/*串连接*/
bool Concat(HString &T,HString S1,HString S2)
{
	if (T.ch)
	{
		free(T.ch);
	}
	T.length=StrLength(S1)+StrLength(S2);
	T.ch=(char *)malloc(sizeof(char)*T.length);
	if (!T.ch)
	{
		return false;//分配内存失败
	}
	char *head=T.ch;
	for (int i=0;i<StrLength(S1);i++)
	{
		*T.ch=*S1.ch;
		T.ch++;
		S1.ch++;
	}
	for (int i=StrLength(S1)-1;i<T.length;i++)
	{
		*T.ch=*S2.ch;
		T.ch++;
		S2.ch++;
	}
	T.ch=head;
	return true;
}
/*求子串*/
bool SubString(HString &Sub,HString S,int pos,int len)
{
	if (pos<1||pos>S.length||len<0||len>S.length-pos+1)
	{
		return false;
	}
	if (Sub.ch)
	{
		free(Sub.ch);
	}
	if (!len)
	{
		Sub.ch=NULL;
		Sub.length=0;
		return true;
	}
	else
	{
		Sub.ch=(char*)malloc(sizeof(char)*len);
		Sub.length=len;
		char *head=Sub.ch;
		S.ch+=pos-1;
		for (int i=0;i<len;i++)
		{
			*Sub.ch=*S.ch;
			Sub.ch++;
			S.ch++;
		}
		Sub.ch=head;
		return true;
	}
}

/*打印串*/
void prinfStr(HString S)
{
	for (int i=0;i<S.length;i++)
	{
		printf("%c",*S.ch);
		S.ch++;
	}
	printf("\n");
}

二、主程序测试以上操作

int _tmain(int argc, _TCHAR* argv[])
{
	//串赋值
	HString str1;
	if(StrAssign(str1,"me"))
		prinfStr(str1);
	HString str2;
	if(StrAssign(str2,"Sunhaoyu"))
		prinfStr(str2);
	//串比较
	printf("%d\n",StrCompare(str1,str2));
	//清空串
	StrClear(str1);
	prinfStr(str1);
	//串连接
	HString str3,str4;
	StrAssign(str3,"sun");
	StrAssign(str4,"haoyu");
	Concat(str1,str3,str4);
	prinfStr(str1);
	//求子串
	SubString(str2,str1,4,3);
	prinfStr(str2);
	system("pause");
	return 0;
}

在这里插入图片描述
补充
三、串的块链存储表示
1、该存储结构为链式存储结构
2、存储密度=串值所占的储存位/实际分配的存位
3、块链结构:是结构中包含头指针、尾指针、当前串长度的一种结构
4、使用块链结构的目的是为了提高存储密度
5、串的块链存储结构如下:

/************************************************************************/
/* 串的块链存储结构                                                       */
/************************************************************************/
#define NodeSize 66
typedef struct Node{
	char ch[NodeSize];
	struct Node *next;
}strNode;
typedef struct{
	strNode *head,*rear;
	int curLen;
}LString;
  • 10
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mekeater

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

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

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

打赏作者

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

抵扣说明:

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

余额充值