String (Linked List)
June 5, 2018
Requirements:
1. TString中动态申请内存时,no memory wastage is allowed throughout the execution.
2. Can’t request a fixed size of memory at a time (比如每次申请100MB固定大小空间的形式算违规).
3. 如果需要申请临时交换内存,也不能按固定大小申请,必须按需申请,使用完毕后立即释放.
4. 不允许使用string类,不允许定义数组,不允许使用任何形式的全局变量,动态内存申请必须是new/delete.
5. 实现!= 时,只有长度相等且对应位置字符值相等才认为相等,否则就是不等.
6. 要求+=的复杂度尽量低.
class TString;
class str {
char *content;
str *next;
int len;
friend TString;
};
class TString {
private:
str *head;
str *tail;
int len_all;
public:
TString();
~TString();
TString& operator+=(const char *);
int length();
bool operator!=(const char*);
};
TString::TString()
{
head = new(nothrow) str;
head->next = NULL;
tail = head->next;
len_all = 0;
}
TString::~TString()
{
str *q, *p = head;
while (p)
{
delete[]p->content;
q = p->next;
delete[]p;
p = q;
}
head = NULL;
}
bool TString::operator!=(const char* b)
{
str *p = head->next;
int num = 0;
while (p)
{
if (strncmp(b + num, p->content, p->len))
return true;
num += p->len;
p = p->next;
}
return false;
}
TString& TString::operator+=(const char* s)
{
int len_s = strlen(s);
len_all += len_s;
tail = new(nothrow)str[1];
tail->content = new(nothrow)char[len_s + 1];
tail->len = len_s;
memcpy(tail->content, s, len_s + 1);
tail = tail->next;
tail = NULL;
return *this;
}
int TString:: length()
{
return len_all;
}