串的堆分配存储表示
前言
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;