所以我想复制一个完整的链表类,我很难搞清楚如何这样做,
class list{
public:
list(const list &t);
private:
struct Node{
int x;
Node *next;
}*p;
我从这样的事情开始:
list::list(const list &t){
Node* q;
q=new Node;
while (p!=NULL){
q->x= p->x;}
}
但我不确定我是在正确的轨道上还是什么。我也有麻烦我应该如何测试这样的拷贝构造函数?例如,我有列表l1,然后我将几个整数插入列表,然后我如何复制它?
答案 0 :(得分:2)
在您的示例中,如果您初始化p,它将永远不会工作,或者如果p != NULL
将永远工作。遍历t list
时必须分配新节点:
p = NULL;
Node* copy = l.p;
Node* insert = p;
Node* inserted_el = NULL;
while (copy){
insert = new Node();
insert->x = copy->x;
insert->next = NULL;
if (inserted_el) {
inserted_el->next = insert; //copy memory pointer to next element
} else {
p = insert; //copy memory pointer to list head
}
copy = copy->next;
inserted_el = insert;
}
这是基本的想法。另外不要忘记实现assign运算符和析构函数。 用法:
list t1;
//insert nodes
list t2(t1);
答案 1 :(得分:1)
您的代码中最大的麻烦是您不需要复制列表中的每个节点。
以下是ctor的代码:
list::list(const list &t)
{
p = NULL; // Init the head of the list this is vital important.
// Loop over the elements of the passed list if any.
Node *pt = t.p;
Node *last_local_element = NULL;
while (pt != NULL)
{
// Allocate a new node and set the fields there.
Node *q = new Node;
q->x= pt->x;
q->next = NULL;
// Add new node to the local list.
if (last_local_element != NULL) {
last_local_element->next = q;
} else {
p = q;
}
last_local_element = q;
// Shift the loop variable along the passed list.
pt = pt->next;
}
}
最常见的情况是调用复制程序时的情况:
list my_list1;
list my_list2(my_listl); // Explicit call.
list my_list3 = my_listl; // Assignment in the definition statement.
答案 2 :(得分:1)
根据您的类设计,您需要小心内存管理。这是代码:
list::list(const list& t) {
Node* n = t.p;
Node* m = p;
while (n) {
if (!m) {
m = new Node(); // Allocate memory.
if (!p) p = m;
}
m->x = n->x;
m = m->next;
n = n->next;
}
if (m) { // Original list is longer, delete the rest of the list.
Node * tmp = m;
m = m->next;
delete tmp;
}
}