簡體   English   中英

在C ++中實現雙向鏈表副本構造函數

[英]Implementing a doubly linked list copy constructor in C++

我在弄清楚如何為雙向鏈表實現副本構造函數時遇到了麻煩。 我相信,到目前為止我所擁有的代碼是不正確的,因為我無法跟蹤標頭節點,但是我不確定該如何糾正。 任何幫助將非常感激!

DoublyLinkedList.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 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM