2014-10-05 60 views
0

因此,我嘗試將我的java版本的鏈接列表移植到C++,並且使用指針指向正確的對象非常困難。刪除遍歷和反向遍歷的目標是簡單地按順序打印鏈表的值,然後按相反的順序打印。這是代碼。我發佈大部分內容而不是特定部分的原因是因爲我相信你需要它的上下文。LinkedList C++中的指針問題

控制檯輸出: 它們是相等 除去5 橫移 -858993460

它打印出它們是相等的,因爲它立即打破在while循環的在刪除(數據)的第一次迭代。

#include <iostream> 
#include <string> 
#include <string.h> 

using namespace std; 

class Node{ 

public: 
    int data; 
    Node *pNext; 


    Node(); 
    Node(int x); 
}; 

Node::Node(){ 
    data = NULL; 
    pNext = NULL; 
} 

Node::Node(int x){ 
    data = x; 
    pNext = NULL; 
} 

class List{ 

private: 
    Node *head = NULL; 
public: 

    void insert(int data){ 

     Node temp(data); 
     temp.pNext = head; 

     head = &temp; 



    } 

    Node removeHead(){ 
     if (head != NULL){ 
      Node *temp = head; 
      head = head->pNext; 

      return *temp; 
     } 
     else{ 
      cout << "Empty List" << endl; 
     } 
     return NULL; 
    } 


    Node remove(int data){ 

     Node *previousLink = head; 
     Node *currentLink = head; 

     while (currentLink->data != data){ 
      if (currentLink == currentLink->pNext){ 
       cout << "They are equal" << endl; 
       break; 
      } 

      previousLink = currentLink; 
      if (currentLink->data == NULL) 
      currentLink = currentLink->pNext; 

      cout << "Current " << currentLink->data << " Previous " 
      << previousLink->data <<endl; 

     } 

     if (head->data == data){ 
      head = head->pNext; 
     } 
     else{ 
      previousLink->pNext = currentLink->pNext; 
     } 

     return *currentLink; 
    } 

    void traverse(){ 

     traverse(head); 
    } 

    void reverseTraverse(){ 
     reverseTraverse(head); 
    } 


private: 
    void traverse(Node *link){ 
     cout << link->data << endl; 

     if (link != link->pNext) 
      traverse(link->pNext); 
    } 

    void reverseTraverse(Node *link){ 
     if (link != link->pNext) 
      traverse(link->pNext); 

     cout << link->data << endl; 
    } 



}; 

int main(){ 
    cout << " Hello World\n"; 
    List list; 


    for (int i = 0; i <= 9; ++i) 
     list.insert(i); 

    list.remove(5); 
    cout << "removed 5\n"; 

    cout << "traverse" << endl; 
    list.traverse(); 

    cout << "reverse" << endl; 
    list.reverseTraverse(); 

    system("PAUSE"); 
    return 0; 


} 
+0

它不是很清楚爲什麼你不使用內置的STL容器。也許使用[Standard Containers](http://www.cplusplus.com/reference/stl/)會更容易,就像'List '一樣。 – jww 2014-10-05 04:00:32

回答

0

你的問題是,如果你說:

Node temp(data); 

那麼它只是一個局部變量,它的函數結束後,它會消失,例如你的插入功能。改爲使用new,然後在刪除它時刪除它。

順便說一句,你不需要List類。該節點是列表。

+0

絕對正確。即使沒有分配,我仍然認爲指針仍然可以工作。長時間沒有使用C++。謝謝你的幫助!這固定了它。 – user2848834 2014-10-05 04:11:13