#ifndef HSTRING
#define HSTRING
#include <stdlib.h>
#include <string.h>
class HString{
public:
HString() = default;
void StrAssign(char * chars) {
int i;
char *c;
for (i = 0, c = chars; *c != '\0'; i++, c++);
if (!i) {
ch = NULL;
length = 0;
} else {
ch = (char *)malloc(sizeof(char) * i);
memset(ch, 0 ,sizeof(ch));
if (!ch) {
abort();
}
int tempi = 0;
char *head = ch;
do {
tempi++;
*ch = *chars;
ch++;
chars++;
} while (tempi != i);
*ch = '\0';
ch = head;
length = i;
}
}
int StrLength() {
return length;
}
void ClearString() {
if (ch) {
free(ch);
ch = NULL;
}
length = 0;
}
void StrInsert(HString T, int pos) {
int i;
if (pos < 0 || pos >= length) {
abort();
}
ch = (char *)realloc(ch, (length + T.StrLength()) * sizeof(char));
if (T.StrLength()) {
for(i = pos; i<length; i++) {
ch[i + T.StrLength()] = ch[i];
}
for(i = 0; i < T.StrLength(); i++) {
ch[i + pos] = T.ch[i];
}
length += T.length;
}
}
char *ch{nullptr};
int length;
};
inline 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.StrLength() - T.StrLength();
}
inline HString Concat(HString &T, HString S1, HString S2) {
if (T.ch) {
T.ClearString();
}
T.length = S1.StrLength() + S2.StrLength();
T.ch = (char *)malloc(sizeof(char) * T.StrLength());
memset(T.ch, 0 ,sizeof(T.ch));
if (!T.ch) {
abort();
}
char *head = T.ch;
for (int i = 0; i < S1.StrLength(); i++){
*T.ch = *S1.ch;
T.ch++;
S1.ch++;
}
for (int i = S1.StrLength() - 1; i < T.StrLength(); i++) {
*T.ch = *S2.ch;
T.ch++;
S2.ch++;
}
T.ch = head;
return T;
}
inline HString SubString(HString &sub, HString S, int pos, int len) {
if (pos < 0 || pos > S.StrLength() || len < 0 || len > S.StrLength() - pos) {
abort();
}
if (sub.ch) {
sub.ClearString();
}
if (!len) {
sub.ch = NULL;
sub.length = 0;
} else {
sub.length = len;
sub.ch = (char *)malloc(len * sizeof(char));
memset(sub.ch, 0 ,sizeof(sub));
char *head = sub.ch;
S.ch += pos;
for(int i = 0; i < len; i++) {
*sub.ch = *S.ch;
sub.ch++;
S.ch++;
}
sub.ch = head;
}
return sub;
}
#endif
【数据结构】串的堆分配存储
于 2023-11-05 14:17:41 首次发布