也叫变长分配存储表示
定义结构体
typedef struct HString {
char *ch;//指针指向新开辟的空间
int length;//用表示字符串的长度表示字符串的结束
}HString;
初始化
void InitString(HString *S) {
S->ch = NULL;
S->length = 0;
}
打印输出
void PrintString(HString *S) {
for(int i=0;i<S->length;i++)
printf("%c", S->ch[i]);
printf("\n");
}
给串赋值
void StrAssign(HString *S, char *str) {
if (S->ch != NULL)free(S->ch);
int len = strlen(str);
S->ch = (char*)malloc(sizeof(char)*len);
for (int i = 0; i < len;i++) {
S->ch[i] = str[i];
}
S->length = len;
}
串复制
void StrCopy(HString *S, HString *T){
//T:abc ——> S:abc
int Tlen = StrLength(T);
if (S->ch != NULL) free(S->ch);
S->ch = (char*)malloc(sizeof(char)*Tlen);
assert(S->ch != NULL);
for (int i = 0; i < Tlen; i++) {
S->ch[i] = T->ch[i];
}
S->length = Tlen;
}
串比较
int StrCompare(HString *S, HString *T) {
if (S->length == 0 && T->length == 0) return 0;
int res = 0;abc VS //abc
int i=0, j=0;
while (i<S->length && j<T->length) {//当S和T串长度相等时,比较字符的ASCII码
if (S->ch[i] < T->ch[j])///abc VS efg
return -1;
else if(S->ch[i]>T->ch[j])//efg VS abc
return 1;
else {//abc VS abc
i++;
j++;
}
}
//i>S->length || j>T->length 跳出循环说明T,S串数目不等
if (j < T->length) {//若j满足条件则说明i>S->length,先跳出循环,则T串数目比S串多
res = -1;
}
if(i<S->length) {//S串数目比T串多
res = 1;
}
return res;
}
串连接
void StrConcat(HString *T, HString *s1, HString *s2) {
int s1_len = StrLength(s1);
int s2_len = StrLength(s2);
if (T->ch != NULL)free(T->ch);
T->ch =(char*) malloc(sizeof(char)*(s1_len + s2_len));
int i, j;
for (i= 0; i < s1_len; i++) {
T->ch[i] = s1->ch[i];
}
for (j = 0; j < s2_len; j++) {
T->ch[i + j] = s2->ch[j];
}
T->length = s1_len + s2_len;
}
取子串
void SubString(HString *S, HString *sub, int pos, int len) {
if (len<0 || len>S->length || pos<0 || pos>S->length) return;
if (sub->ch != NULL)free(sub->ch);
sub->ch = (char*)malloc(sizeof(char) * len);
assert(sub->ch != NULL);
for (int i = 0; i < len; i++) {
sub->ch[i] = S->ch[i + pos];
}
sub->length = len;
}
指定位置前插入串
void StrInsert(HString *S, int pos, HString *T) {
//从最后一个元素开始往后移动T串的长度个距离
int T_len = StrLength(T);
if (T_len == 0)return;
if (pos < 0 || pos>T_len) return;
//重新开辟空间
char *ch = (char*)realloc(S->ch, sizeof(char)*(S->length + T_len));
assert(ch != NULL);
S->ch = ch;
for (int i = S->length - 1; i >= pos; i--) {
S->ch[i + T_len] = S->ch[i];
}
for (int j = 0; j < T_len; j++) {
S->ch[pos + j] = T->ch[j];
}
S->length += T_len;
}
指定位置删除串
void StrDelete(HString *S, int pos, int len) {
if (pos<0 || pos>S->length)
return;
if (len <= 0 || len > S->length)
return;
//往前移动len个单位
for (int i = 0; i < S->length; ++i) {
S->ch[pos + i] = S->ch[pos + i + len];
}
S->length -= len;
}
清空串
void StrClear(HString *S) {
S->length = 0;
if (S->ch != NULL)
free(S->ch);
S->ch = NULL;
}