/*
用动态数组实现了顺序表
作者:吕翔宇
e-mail:630056108@qq.com
ALL RIGHTS RESERVED!
版权所有©
*/
#include<iostream>
template<typename T>
class List {
public:
List(int n) {
content = new T[n];
maxLength = n;
}
~List() {
free(content);
}
bool insert(T tmp, int loc = 0) {
if (loc > location)
return false;//非法
while (location >= maxLength)
enlargeByTwice();//申请内存的时间复杂度是O(lg n)
content[location++] = tmp;
memcpy(content + loc * sizeof(T), content, sizeof(T)*(location - loc));
return true;
}
bool erase(int loc) {
if (loc > location || loc < 0)
return false;//非法
//std::cout<<(int*)content+
memcpy(content + loc, content + (loc + 1), (location - loc - 1));
location--;
}
void unionList(List<T> &tmp) {
int loc = tmp.location + location;
while (loc >= maxLength)
enlargeByTwice();
memcpy(content + location, tmp.content, tmp.location*sizeof(T));
location = loc;
}
T& at(int loc) {
return content[loc];
}
int length() {
return location;
}
void printAll() {
for (int i = 0; i < location; i++) {
std::cout << content[i] << " ";
}
std::cout << std::endl;
}
private:
T *content;
int maxLength;
int location;//链位置指针
void enlargeByTwice() {//扩大两倍
T* tmp = new T[maxLength * 2];
memcpy(tmp, content, sizeof(T)*maxLength);
free(content);
content = tmp;
maxLength *= 2;
}
T& operator[](int loc) throw(...) {//寻址
if (loc > maxLength) {
while (maxLength < loc)
enlargeByTwice();//申请内存的时间复杂度是O(lg n)
}
return content[loc];
}
};
int main() {
List <int>a(2),b(1000);
int size = 2;
for (int i = 0; i < 10; i++) {
a.insert(i);
b.insert(10 - i);
}
a.printAll();
b.printAll();
a.unionList(b);
a.printAll();
system("pause");
return 0;
}