堆分配存储的串的表示和实现

串的堆分配存储结构

struct HString{char * ch;//若是非空串,则按串长分配存储区;否则ch为NULLint length;//串长度};

堆分配存储的串的12个基本操作

#define DestroyString ClearString//DestroyString()和ClearString()作用相同void InitString(HString &S){S.length = 0;S.ch = NULL;}void ClearString(HString &S){free(S.ch);InitString(S);}Status StrAssign(HString &T, char *chars){//生成一个其值等于chars的串Tint i, j;if (T.ch)//T指向某存储单元free(T.ch);//释放T原有存储空间i = strlen(chars);//求chars的长度iif (!i)//chars的长度为0InitString(T);{T.ch = ((OVERFLOW);for (j = 0; j < i; j ++)//分配串存储空间成功后,复制串chars[]到串TT.ch[j] = chars[j];T.length = i;//更新串T的长度}}void StrCopy(HString &T, HString S){//由串S复制得串Tint i;if (T.ch)//串T不空free(T.ch);//释放串T原有存储空间T.ch = ((OVERFLOW);for (i = 0; i < S.length; i++)//从第1个字符到最后一个字符T.ch[i] = S.ch[i];//逐一复制字符T.length = S.length;//复制串长}Status StrEmpty(HString S){TRUE;elsereturn FALSE;}int StrCompare(HString S, HString T){//若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0int i;S.ch[i] – T.ch[i];//不相等,,则返回2字符ASCII码之差return S.length – T.length; //在有效范围内,字符相等,但长度不等,返回长度之差}int StrLength(HString S){return S.length;}Status Concat(HString &T, HString S1, HString S2){//用T返回S1和S2连接而成的新串。若未截断,则返回TRUE;否则返回FALSEint i;if (T.ch)//串T不空free(T.ch);//释放串T原有存储空间T.length = S1.length + S2.length;//串T的长度 = 串S1的长度 + 串S2的长度T.ch = ((OVERFLOW);for (i = 0; i < S1.length; i++)//将串S1的字符逐一复制给串TT.ch[i] = S1.ch[i];for (i = 0; i < S2.length; i++)//将串S2的字符逐一复制给串T(接在串S1的字符之后)T.ch[S1.length + i] = S2.ch[i];}Status SubString(HString &Sub, HString S, int pos, int len){//用Sub返回串S的自第pos个字符起长度为len的子串int i;(Sub.ch)(!len)//空子串InitString(Sub);{Sub.ch = ((OVERFLOW);for (i = 0; i <= len – 1; i++)//将串S第pos个字符起长度为len的子串的字符逐一复制给串SubSub.ch[i] = S.ch[pos – 1 + i];Sub.length = len;//串Sub的长度}return OK;}Status StrInsert(HString &S, int pos, HString T){//在串S的第pos个字符之前插入串T。int i;if (pos < 1 || pos > S.length + 1)//pos不合法return ERROR;if (T.length){//T非空S.ch = ((OVERFLOW);for (i = S.length – 1; i >= pos – 1; –i)//为插入T而腾出位置S.ch[pos – 1 + i] = T.ch[i];for (i = 0; i < T.length; i++)//插入TS.ch[pos – 1 + i] = T.ch[i];S.length += T.length;//更新串S的长度}return OK;}Status StrDelete(HString &S, int pos, int len){//从串S中删除自第pos个字符起长度为len的子串int i;if (S.length < pos + len – 1)//pos和len的值超出范围return ERROR;for (i = pos – 1; i <= S.length – len; i++)//将待删除子串之后的字符逐一前移S.ch[i] = S.ch[i + len];S.length -= len;//更新串S的长度S.ch = (char *)realloc(S.ch, S.length * sizeof(char));//重新分配串S的存储空间(减少)return OK;}void StrPrint(HString S){int i;for (i = 1; i <= S.length; i++)printf(“%c”, S.ch[i]);printf(“\n”);}

为你的快乐而快乐的是朋友,为你的难过而难过的才是你的知己。

堆分配存储的串的表示和实现

相关文章:

你感兴趣的文章:

标签云: