我无法弄清楚如何为双向链表实现复制构造函数。我认为到目前为止我的代码是不正确的,因为我忘记了 header 节点,但我不确定如何纠正这个问题。任何帮助将不胜感激!
双链表.h
#include <cstdlib>
#include <iostream>
using namespace std;
class DoublyLinkedList; // class declaration
// list node
class DListNode {
private:
int obj;
DListNode *prev, *next;
friend class DoublyLinkedList;
public:
DListNode(int e = 0, DListNode *p = NULL, DListNode *n = NULL)
: obj(e), prev(p), next(n) {}
int getElem() const { return obj; }
DListNode * getNext() const { return next; }
DListNode * getPrev() const { return prev; }
};
// doubly linked list
class DoublyLinkedList {
protected:
DListNode header, trailer;
public:
DoublyLinkedList() : header(0), trailer(0) // constructor
{ header.next = &trailer; trailer.prev = &header; }
DoublyLinkedList(const DoublyLinkedList& dll); // copy constructor
~DoublyLinkedList(); // destructor
DoublyLinkedList& operator=(const DoublyLinkedList& dll); // assignment operator
DListNode *getFirst() const { return header.next; } // return the pointer to the first node
const DListNode *getAfterLast() const { return &trailer; } // return the pointer to the trailer
bool isEmpty() const { return header.next == &trailer; } // return if the list is empty
int first() const; // return the first object
int last() const; // return the last object
void insertFirst(int newobj); // insert to the first of the list
int removeFirst(); // remove the first node
void insertLast(int newobj); // insert to the last of the list
int removeLast(); // remove the last node
};
// output operator
ostream& operator<<(ostream& out, const DoublyLinkedList& dll);
DoublyLinkedList.cpp - 复制构造函数
// copy constructor
DoublyLinkedList::DoublyLinkedList(const DoublyLinkedList& dll)
{
// Initialize the list
header = 0;
trailer = 0;
header.next = &trailer;
trailer.prev = &header;
// Copy from dll
DListNode* head = new DListNode;
head->prev = dll.header.prev;
head->obj = dll.header.obj;
head->next = dll.header.next;
DListNode* tail = new DListNode;
tail->prev = dll.trailer.prev;
tail->obj = dll.trailer.obj;
tail->next = dll.trailer.next;
DListNode* curr = new DListNode;
curr->prev = head;
while(curr != tail) {
DListNode* n = new DListNode;
curr->next = n;
n = curr->prev->next;
curr = curr->next;
}
curr = tail;
}
最佳答案
与其编写特定的代码来使用内部结构复制 dll 中的列表,不如像往常一样循环遍历 dll 中的列表(使用 dll.getFirst() 和 dll.getAfterLast())并调用 insertLast每个值。
关于c++ - 在C++中实现双向链表复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22030373/