2014-10-05 55 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