【发布时间】:2016-02-24 19:57:04
【问题描述】:
我有以下单链表实现。
template <typename T> struct node{
node(T data):data(data),next(nullptr){}
T data;
node<T> * next;
};
template< typename T> class slist{
node<T>* head;
int size;
public:
slist(node<T>* head):head(head), size(0){}
slist(const slist<T>& rhs){
node<T>* temp = rhs.getHead();
node<T>* p = new node<T>(temp->data);
head = p;
node<T>* current = p;
while(temp != nullptr){
current = current->next;
current->data = temp->data;
}
}
~slist(){
if(head == nullptr) return;
while(head != nullptr){
node<T>* current = head;
head = head->next;
delete(current);
}
}
slist& operator= (const slist& rhs){
}
node<T>* getHead()const {
return head;
}
void insertFront(T item){
node<T>* p = new node<T>(item);
if(head == nullptr){
p = head;
size++;
return;
}
p->next = head;
head = p;
size++;
}
void insertBack(T item){
node<T>* p = new node<T>(item);
node<T>* current = head;
while(current->next != nullptr){
current = current->next;
}
current->next = p;
size++;
}
void remove(T item){
bool check = false;
node<T>* current = head;
try {
while(current != nullptr){
if(current->data == item) check = true;
current = current->next;
}
if(!check){
throw std::runtime_error("Item not in list");
}
}catch(std::runtime_error& e){
std::cout<<e.what()<<std::endl;
exit(-1);
}
current = head;
while(current != nullptr){
if(current->next->data == item){
node<T>* temp = current->next;
current->next = current->next->next;
delete(temp);
break;
}
current = current->next;
}
size--;
}
int getSize () const {
return size;
}
void printList(){
node<T>* current = head;
while(current != nullptr){
if(current->next != nullptr){
std::cout<<current->data<<"->";
}else{
std::cout<<current->data<<std::endl;
}
current = current->next;
}
}
};
基于类和复制构造函数的当前实现,有人可以帮助赋值运算符重载。此外,我对复制构造函数和赋值重载有点困惑。我的理解是,复制构造函数会创建一个新列表,该列表与旧列表中的旧列表具有相同的值。所有节点的下一个地址将不同,但值将相同,因为它是深层副本。我的理解是否正确,然后赋值重载有什么作用?
【问题讨论】:
-
复制分配与复制构造具有相同的目标。您只需要知道容器中已经有数据。复制构造函数应该创建一个与原始容器具有相同数据的容器,但它是一个独立的对象。
-
使用复制和交换习语(google it)。
-
在您的复制构造函数中,您需要使用
new创建每个节点,而不仅仅是第一个。 (循环内应该有一个new。)