我不是很擅长这个,我有点卡住为单个链表制作复制构造函数以及随之而来的节点。
这是我的头文件:
#pragma once
#include <iostream>
using namespace std;
class Node
{
public:
int data;
Node* next;
Node()
{
next = NULL;
data = 0;
}
Node(const Node& copyNode); /*: data(copyNode.data), next(copyNode.next ? new Node(*copyNode.next) : NULL)*/
};
class SLLIntStorage
{
public:
Node* head;
Node* current;
Node* tail;
void Read(istream&);
void Write(ostream&);
void setReadSort(bool);
void sortOwn();
void print();
void mergeSort(Node**);
Node *merge(Node*, Node*);
void split(Node*, Node**, Node**);
bool _sortRead;
int numberOfInts;
SLLIntStorage(const SLLIntStorage& copying) //: head(copying.head ? new Node(*copying.head) : NULL)
{
}
SLLIntStorage(void);
~SLLIntStorage(void);
};
inline ostream& operator<< (ostream& out, SLLIntStorage& n)
{
n.Write(out);
return out;
}
inline istream& operator>> (istream& in, SLLIntStorage& s)
{
s.Read(in);
return in;
}
有谁能帮我理解这是如何运作的,以及我可以做些什么来创造它?谢谢。
答案 0 :(得分:4)
要复制链接列表,您必须迭代整个链接列表并制作每个节点的副本,并将其附加到新列表。请记住,您不只是复制指针,但您必须复制整个Node
结构和任何需要复制的数据(例如,如果数据是指针,您还需要对这些数据进行深层复制) )。
所以这是SLLIntStorage类的示例复制构造函数:
SLLIntStorage(const SLLIntStorage& copying) : head(NULL)
{
Node* cur = copying.head;
Node* end = NULL;
while (cur)
{
Node* n = new Node;
n->data = cur->data;
if (!head) {
head = n;
end = head;
} else {
end->next = n;
end = n;
}
cur = cur->next;
}
}
请注意,我没有考虑tail
和current
数据成员等。您必须考虑这些因素。
答案 1 :(得分:1)
由于这是家庭作业,我将试着提出一个想法,你可以从中找出你需要用副本构造函数做什么。
Node(const Node& copyNode) : data(copyNode.data),
next(copyNode.next)
{
// ....
}
在上面的代码段中,您实际上只是将next
指向copyNode::next
指向的位置。因此,当任何指针释放它所指向的资源而留下另一个悬空时,你会遇到问题。
因此,您应该将每个实例的指针next
指向它独立持有的位置。所以, -
Node(const Node& copyNode) : data(copyNode.data),
next(new Node)
{
(*next) = *(copyNode.next) ;
// ....
}
另请阅读此主题有一个很好的解释 - Rule of Three