如何在链表中使用复制赋值操作符



我必须使用复制构造函数和复制赋值操作符来测试链表。

list1有3个双精度对象

list2 = list1,其中包含复制构造函数

List4 = list3 = list1是使用复制赋值操作符的地方。

则list4后面又加了1个double。

这是给我上的课。

// Specification file for the NumberList class
#ifndef NUMBERLIST_H
#define NUMBERLIST_H
class NumberList
{
private:
// Declare a structure for the list
struct ListNode
{
double value;           // The value in this node
struct ListNode *next;  // To point to the next node
}; 
ListNode *head;            // List head pointer
public:
// Constructor
NumberList()
{ head = NULL; }

//TO DO: Add the copy constructor 
NumberList(const NumberList& origObject);
//TO DO: Add the overloaded assignment operatora
NumberList& operator=(const NumberList& objToCopy);
// Destructor
~NumberList();

// Linked list operations
void appendNode(double);
void insertNode(double);
void displayList() const;
};
#endif

我有一个简单的复制构造函数,它做它必须做的事情。当我执行程序时,构造函数似乎做了它必须做的事情。我认为这是因为它只使用了一次复制构造函数。

NumberList::NumberList(const NumberList& origObject){

cout << "copy constructor called." << endl;
head = new ListNode;
*head = *(origObject.head);
}

这是复制赋值操作符

NumberList& NumberList::operator=(const NumberList& objToCopy){
cout << "overlaoded operator" << endl;
if(this != &objToCopy){
head = new ListNode;

ListNode* nodePtr = new ListNode;
nodePtr = objToCopy.head;
nodePtr->next = NULL;
ListNode* temp = objToCopy.head->next;
while(temp){
nodePtr->next = new ListNode;
nodePtr->next = temp;
nodePtr = nodePtr->next;
nodePtr->next = NULL;
temp = objToCopy.head->next;
}
}
return *this;
}

激活复制赋值后显示如下:list4=list3=list1

After inserting 5.5 to list4, List1 is: 
1.6
After inserting 5.5 to list4, List3 is: 
0
After inserting 5.5 to list4, List4 is: 
0
5.5

是这样的。它应该看起来像使用了操作符后的样子。

After inserting 5.5 to list4, List1 is: 
1.6
4.8
7.9
After inserting 5.5 to list4, List3 is: 
1.6
4.8
7.9
After inserting 5.5 to list4, List4 is: 
1.6
4.8
5.5
7.9

我觉得我想得越多,我就越不明白我写的代码。所以我基本上一直在写东西,希望它能起作用。


假设appendNode已经过测试并正常工作,我建议对源列表进行简单的循环,然后在当前列表中调用appendNode:

for (auto* node = objToCopy.head; node; node = node->next)
{
appendNode(node->value);
}

这一个循环将复制整个源列表。

记住先释放旧的列表。


为了使appendNode更简单,更有效,并且当你想要附加一个节点时不必遍历整个列表,我建议你还存储一个指向列表尾部的指针。

相关内容

  • 没有找到相关文章

最新更新