串的堆分配C语言实现
时间: 2024-05-23 19:06:05 浏览: 18
下面是C语言实现串的堆分配的代码示例:
```c
// 串结构
typedef struct HString {
char *ch; // 指向字符串所在空间首地址
int length; // 记录字符串长度
} HString;
// 初始化串
void InitString(HString *S) {
S->ch = NULL;
S->length = 0;
}
// 生成一个值等于串常量T的串S
void StrAssign(HString *S, char *T) {
int len = strlen(T);
if (len == 0) {
S->ch = NULL;
S->length = 0;
} else {
S->ch = (char *)malloc(sizeof(char) * len);
assert(S->ch != NULL);
for (int i = 0; i < len; ++i) {
S->ch[i] = T[i];
}
S->length = len;
}
}
// 销毁串
void DestroyString(HString *S) {
if (S->ch != NULL) {
free(S->ch);
S->ch = NULL;
}
S->length = 0;
}
// 复制串
void StrCopy(HString *S, HString *T) {
int len = T->length;
if (S->ch != NULL) {
free(S->ch);
}
S->ch = (char *)malloc(sizeof(char) * len);
assert(S->ch != NULL);
for (int i = 0; i < len; ++i) {
S->ch[i] = T->ch[i];
}
S->length = len;
}
// 串比较
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;
}
// 求子串
void SubString(HString *Sub, HString *S, int pos, int len) {
if (pos < 1 || pos > S->length || len < 0 || pos + len - 1 > S->length) {
printf("Error: invalid position or length.\n");
exit(1);
}
if (Sub->ch != NULL) {
free(Sub->ch);
}
if (len == 0) {
Sub->ch = NULL;
Sub->length = 0;
} else {
Sub->ch = (char *)malloc(sizeof(char) * len);
assert(Sub->ch != NULL);
for (int i = 0; i < len; ++i) {
Sub->ch[i] = S->ch[pos + i - 1];
}
Sub->length = len;
}
}
// 串插入
void StrInsert(HString *S, int pos, HString *T) {
if (pos < 1 || pos > S->length + 1) {
printf("Error: invalid position.\n");
exit(1);
}
int len = T->length;
S->ch = (char *)realloc(S->ch, sizeof(char) * (S->length + len));
assert(S->ch != NULL);
for (int i = S->length - 1; i >= pos - 1; --i) {
S->ch[i + len] = S->ch[i];
}
for (int i = 0; i < len; ++i) {
S->ch[pos + i - 1] = T->ch[i];
}
S->length += len;
}
// 串删除
void StrDelete(HString *S, int pos, int len) {
if (pos < 1 || pos > S->length || len < 0 || pos + len - 1 > S->length) {
printf("Error: invalid position or length.\n");
exit(1);
}
for (int i = pos - 1; i < S->length - len; ++i) {
S->ch[i] = S->ch[i + len];
}
S->length -= len;
S->ch = (char *)realloc(S->ch, sizeof(char) * S->length);
assert(S->ch != NULL);
}
```