2014-02-28 65 views
0

我是新來的雙向鏈表。我正在編寫幾段代碼:一個用於將項目添加到前端的功能,另一個用於將項目添加到後端的功能,以及用於從前到後輸出鏈接列表的前向和後向顯示方法,分別。
我在輸出中遇到了一個錯誤,我試圖理解。看來我的addFront和display功能正在工作,但我的addBack可能是我的錯誤所在。我發佈了我的輸出結果以及它在這篇文章的底部顯示的內容。 這是我迄今爲止的代碼。麻煩添加項目到雙向鏈表後面

#include<iostream> 
using namespace std; 

class doubleLinkedList 
{ 
private: 
    class node 
    { 
    public: 
     int data; 
     node* next; 
     node* prev; 
     node(int x) 
     { 
      data = x; 
      next = NULL; 
      prev = NULL; 
     } 
    }; 
public: 
    node* head; 
    node* tail; 
    int count; 



    doubleLinkedList();  //default constructor 
    ~doubleLinkedList();  //destructor 

    void displayForward(); //display items from front to back 
    void displayBackward(); //display items from back to front 

    void addFront(int);  //add item to front of linked list 
    void addBack(int);  //add item to back of linked list 

    int removeFront();  //remove item from front of linked list 
    int removeBack();  //remove item from back of linked list 
}; 

//constructor 
doubleLinkedList::doubleLinkedList(){ 
    head = tail = NULL; 
    count = 0; 
} 


//destructor 
doubleLinkedList::~doubleLinkedList(){ 
    node* current = head; 

    while(current != NULL) 
    { 
     node* previous = current; 
     current = current->next; 
     delete previous; 
    } 

    head = tail = NULL; 
    count = 0; 
} 


//display items in linked list from front to back 
void doubleLinkedList::displayForward(){ 
    node* pCurrent = head; 
    while (pCurrent != NULL) 
    { 
     cout << pCurrent->data << " "; 
     pCurrent = pCurrent->next; 
    } 
    cout << count; 
} 


//display items in linked list from back to front 
void doubleLinkedList::displayBackward(){ 
    node* pCurrent = tail; 
    while (pCurrent != NULL) 
    { 
     cout <<pCurrent->data << " "; 
     pCurrent = pCurrent->prev; 
    } 
    cout << count; 
} 


//add item to front of linked list 
void doubleLinkedList::addFront(int x){ 

    node* n = new node(x); 
    n->next = head; 
    n->prev = NULL; 

    if (head != NULL) 
     head->prev = n; 
     head = n; 
     count++; 

    if (tail == NULL) 
     tail = n; 
} 

void doubleLinkedList::addBack(int x){ 
    node* n = new node(x); 

    n->next = NULL; 
    n->prev = tail; 
    tail = n; 

    count++; 
} 

////////////////////我的測試代碼:///////////////////

int main() 
{ 
    doubleLinkedList list; 

    list.addBack(40); 
    list.addBack(50); 
    list.addBack(60); 
    list.addFront(30); 
    list.addFront(20); 
    list.addBack(70); 
    list.addBack(80); 
    list.addFront(10); 

    list.displayForward(); //10 20 30 8 (the 8 value is the count/size i'm keeping track of) 
     cout << endl; 
    list.displayBackward(); //80 70 60 50 40 8 
     cout << endl; 

     system("pause"); 
     return 0; 
     } 

我的輸出應該顯示10 20 30 40 50 60 70 80 和80 70 60 50 40 30 20 10
而是我displayForward顯示我加入到前面的項目和我的displayBackward顯示的項目我添加到後面。

+0

你不應該讓tail->未來隨着n尾= N,在加回過嗎? – sajas

回答

1

您忘記將舊尾巴指向新尾巴的下一個指針。所以,當遍歷列表時,倒數第二個節點仍然指向NULL。

此外,當添加到後面時,您並未檢查頭是否爲空,因此當添加到後面時,您只更新了尾端,並最終以兩個單獨的列表作爲結果。

所以你加入40,50,60的「端部」,所以尾指針被設置,並相應地更新,但頭部不被創建,直到加入到列表中,繼續將元素添加到前面,相應地更新了指針,但是結果是頭部和尾部並沒有實際連接。

void doubleLinkedList::addBack(int x){  
    node* n = new node(x); 

    if (head == nullptr) 
     head = n; //this was your main problem! 

    if (tail != nullptr) 
     tail->next = n; 

    n->next = nullptr; 
    n->prev = tail; 
    tail = n; 

    count++; 
} 

由於您似乎在編寫C++代碼,我建議您習慣使用nullptr而不是NULL。

http://www.codeproject.com/Articles/570638/Ten-Cplusplus11-Features-Every-Cplusplus-Developer

+1

感謝您的提示。該鏈接肯定非常有用。 – JosephK

+0

好的,有些事了。我實現了你的代碼,並得到了我原來的輸出。我在檢查我的顯示器。 – JosephK

+0

好奇,我會再次檢查您的代碼並尋找其他可能的錯誤 – Profan