在C中为LinkedList类创建复制构造函数时寻求帮助
作者:互联网
首先,我意识到StackOverflow上有很多关于此的主题.我在理解其中一些答案时遇到了一些麻烦.我正在创造这个,希望有人能帮助我理解这个过程.
如果这个问题看起来比较新手我很抱歉,但我正在尽力去理解它.
我正在学习数据结构,并被要求根据提供的标头创建LinkedList实现文件.
这是家庭作业,所以请不要’这里是确切的代码’类型的答案.我们欢迎伪代码,步骤和提示.
这是我正在处理的标题的一部分:
typedef std::string ElementType;
class LinkedList
{
private:
class Node
{
public:
ElementType data;
Node * next;
Node( )
: data( ElementType( ) ), next( NULL )
{ }
Node( ElementType initData )
: data( initData ), next( NULL )
{ }
}; // end of Node class
typedef Node * NodePointer;
public:
LinkedList( );
/* Construct a List object
Precondition: none.
Postcondition: An empty List object has been constructed.
*/
LinkedList( const LinkedList &source );
/* Construct a copy of a List object.
Precondition: None.
Postcondition: A copy of source has been constructed.
*/
~LinkedList( );
/* Destroys a List object.
Precondition: None.
Postcondition: Any memory allocated to the List object has been freed.
*/
const LinkedList & operator=( const LinkedList &rightSide );
/* Assign a copy of a List object to the current object.
private:
NodePointer first;
int mySize;
};
到目前为止,我已经创建了析构函数,你能检查并确保它是正确的吗?
//Destructor
LinkedList::~LinkedList()
{
NodePointer ptr = first;
while(ptr != 0 ) {
NodePointer next = ptr->next;
delete ptr;
ptr = next;
}
first = 0;
}
现在这里是我迷失的部分……创建复制构造函数的基本步骤是什么?我已经完成了简单的默认构造函数,但是我对复制构造函数应该做的事情有点困惑.
关于重载=运算符我也有点困惑,我认为它与复制构造函数非常相似.
编辑
我第一次尝试复制构造函数:
LinkedList::LinkedList(const LinkedList & source)
{
//create a ptr to our copy
Node * copy_node = source.first;
//where we will be inserting our copy
Node * insert_node = first;
while(copy_node != nullptr)
{
//insert our new copy node
insert_node = new Node(copy_node->data);
//move to our next node
copy_node = copy_node->next;
if(copy_node != nullptr) {
insert_node = insert_node->next;
} else {
insert_node = first;
}
//update size
mySize++;
}
}
我觉得那里缺少一些东西.
解决方法:
最简单的方法是实现一个函数,它将新节点添加到列表中并在构造函数内的循环中调用它:
LinkedList(const LinkedList& rhs)
{
Node* node = rhs.first;
while (node) {
add(node.data);
node = node->next;
}
}
void add(ElementType data)
{
Node* node = new Node(data);
// add node somehow
// I'd recommend to keep pointer to the tail
}
请注意,此实现不是例外安全!
编辑:为复制构造函数添加了复制功能,这是异常安全的第一步:
LinkedList(const LinkedList& rhs)
{
copy(rhs.first, first);
}
void copy(Node* src, Node*& dest)
{
// handle the head element separately
if (!src) {
return; // empty list
} else {
dest = new Node(src->data); // equivalent to first = new Node...
src = src->next;
}
// copy the rest of the list
Node* p = dest;
while (src) {
p->next = new Node(src->data);
src = src->next;
p = p->next;
}
}
标签:c,copy-constructor,linked-list 来源: https://codeday.me/bug/20190831/1775255.html