【数据结构】串的堆分配存储

#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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值