串的堆分配

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

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

bool InitString(HString &S);
bool StrAssign(HString &T, char *chars);//生成一个其值等于串常量chars的串T
bool StrEmpty(HString S);
int StrLength(HString S);//求串的长度
int StrCompare(HString S, HString T);//比较串的大小 ,返回为正值,则串S>T
bool ClearString(HString &S);//清空串
bool Concat(HString &T, HString S1, HString S2);
bool SubString(HString &Sub, HString S, int pos, int len);
bool StrInsert(HString &S, int pos, HString T);
bool StrDelete(HString &S, int pos, int len);
void StrPrint(HString S);
int Index(HString S, HString T, int pos);

int main()
{
HString S;

int pos, len;

if(InitString(S))//1.初始化一个串
	printf("串初始化成功!\n");

char chars[] = "abcdefgh";//2.调用函数StrAssign函数给串S赋值为“abcdefgh”
/*这样定义chars*/
StrAssign(S, chars);
printf("用函数StrAssign函数给串S赋值为“abcdefgh”,此时串S为:");
StrPrint(S);

HString Sub;//3.调用SubString从串第2个位置取长度为3的子串并输出
InitString(Sub);//一定要初始化串Sub 
pos = 2;
len = 3;
SubString(Sub, S, pos, len);
printf("调用SubString求从串S第2个位置取长度为3的子串Sub,Sub为:");
StrPrint(Sub);

HString T;//4.调用Index函数输出子串"cde"的位置
InitString(T);
pos = 1;
char chars3[] = "cde";
StrAssign(T, chars3);
printf("调用Index函数输出子串“cde”的位置为:%d\n", Index(S, T, pos));

pos = 5;//5.调用StrDelete删除"ef"
len = 2;
StrDelete(S, pos, len);//改成bool StrDelete(HString &S, int pos, HString T);吗? 
printf("用StrDelete删除串S中的“ef”!,此时串S为:");
StrPrint(S);

HString S1;
HString S2;
InitString(S1);//6.初始化串1,串2 
InitString(S2);

char chars1[] = "123";//7.调用函数StrAssign函数给串S1赋值为“123”,串S2赋值为“456”
char chars2[] = "456";
StrAssign(S1,chars1);
StrAssign(S2,chars2); 
printf("调用函数StrAssign函数给串S1赋值为“123”,串S2赋值为“456”!\n"); 
printf("此时串S1为:");
StrPrint(S1);
printf("此时串S2为:");
StrPrint(S2);

printf("调用函数StrCompare比较串S1和串S2,得出:");
if(StrCompare(S1, S2) > 0)//8.调用函数StrCompare比较串1和串2
	printf("串S1>串S2!\n");
else
	if(StrCompare(S1, S2) == 0)
		printf("串S1=串S2!\n");
	else
		printf("串S1<串S2!\n");

printf("调用函数Concat将串S1和串S2连接成串T,此时串T为:");//9.调用函数Concat将串1和串2连接成串T 
Concat(T, S1, S2);
StrPrint(T); 

return 0; 

}
bool InitString(HString &S)
{
S.ch = NULL;
S.length = 0;
return true;
}
bool StrAssign(HString &T, char *chars)//生成一个其值等于串常量chars的串T
{
int chars_strlen;
if(T.ch)
free(T.ch);//释放T原有空间
chars_strlen = strlen(chars);
if(!chars_strlen)//chars的长度为0
{
T.ch = NULL;
T.length = 0;
}
else//chars的长度不为0
{
T.ch = (char *)malloc(chars_strlen * sizeof(char));//为串分配空间
if(!T.ch)
return false;
for(int j = 0; j <= chars_strlen - 1; j ++)
T.ch[j] = chars[j];
T.length = chars_strlen;
}
return false;
}
bool StrEmpty(HString S)//判断串是否为空
{
if(S.length == 0 && S.ch == NULL)
return true;
else
return false;
}
int StrLength(HString S)//求串的长度
{
return S.length;
}
int StrCompare(HString S, HString T)//比较串的大小 ,返回为正值,则串S>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 ClearString(HString &S)//清空串
{
if(S.ch)
{
free(S.ch);
S.ch = NULL;
}
S.length = 0;
return true;
}
bool Concat(HString &T, HString S1, HString S2)//用T返回有S1和S2联接而成的新串
{
if(T.ch)
free(T.ch);//释放T原有空间
T.ch = (char *)malloc((S1.length + S2.length) * sizeof(char));//为串分配空间
if(!T.ch)
return false;
for(int i = 0; i <= S1.length - 1; i ++)
T.ch[i] = S1.ch[i];
T.length = S1.length + S2.length;
for(int i = 0; i <= S2.length - 1; i ++)
T.ch[i + S1.length] = S2.ch[i];
return true;
}
bool SubString(HString &Sub, HString S, int pos, int len)//用Sub返回串S中第pos个字符起长度为len的子串
{
if(pos < 1 || pos > S.length || len < 0 || len > S.length - pos + 1)//1<=pos<=S.length且0<=len<=S.length - pos + 1
return false;
if(Sub.ch)
free(Sub.ch);
if(!len)//len=0
{
Sub.ch = NULL;
Sub.length = 0;
}
else
{
Sub.ch = (char )malloc(len * sizeof(char));
for(int i = 0; i <= len - 1; i ++)
Sub.ch[i] = S.ch[pos - 1 + i];
Sub.length = len;
}
return true;
}
bool StrInsert(HString &S, int pos, HString T)//在串S的第pos个字符之前插入串T
{
if(pos < 1 || pos > S.length + 1)
return false;
if(!T.length)//T非空,则重新分配空间,插入T
{
S.ch = (char )realloc(S.ch, (S.length + T.length) * sizeof(char));
if(!S.ch)
return false;
for(int i = S.length - 1; i >= pos - 1; i --)
S.ch[i + T.length] = S.ch[i];
for(int i = 0; i<= T.length - 1; i ++)
S.ch[pos - 1 + i] = T.ch[i];//think
S.length += T.length;
}
return true;
}
bool StrDelete(HString &S, int pos, int len)//从串中删除从第pos个字符起长度为len的子串
{
if(S.length < pos + len - 1)//不用考虑pos和len的范围吗
return false;
/if(!len)
{
for(int i = pos - 1; i <= S.length - len - 1; i ++)
S.ch[i] = S.ch[i + len];//think
S.length -= len;
}
/
for(int i = pos - 1; i <= S.length - len - 1; i ++)
S.ch[i] = S.ch[i + len];//think
S.length -= len;
S.ch=(char
)realloc(S.ch,S.length
sizeof(char));
return true;

}
void StrPrint(HString S)//输出字符串S
{
for(int i = 0; i < S.length; i ++)
printf("%c", S.ch[i]);
printf("\n");
}
int Index(HString S, HString T, int pos)//返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0
{
//其中T为非空,1<=pos<=S.length
int i = pos - 1;
int j = 0;
while(i < S.length && j < T.length)
{
if(S.ch[i] == T.ch[j])
{
i ++;
j ++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if(j >= T.length)
return i - j + 1;
else
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值