链表C ++中的指针问题

时间:2014-10-05 03:12:39

标签: c++ pointers reference linked-list traversal

所以,我尝试将我的链接列表的java版本移植到c ++,并且我很难使用指针指向正确的对象。删除遍历和反向遍历的目的是简单地按顺序打印出链表的值,然后颠倒顺序。这是代码。我发布大部分而不是某些部分的原因是因为我相信你需要它的背景。

控制台输出: 他们是平等的 删除5 横过 -858993460

打印出它们是相同的,因为它在remove(data)中的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;


}

1 个答案:

答案 0 :(得分:0)

你的问题是,如果你说:

Node temp(data);

然后它只是一个局部变量,它将在封闭函数结束后消失,例如你的插入功能。请改用new,然后在删除它时将其删除。

顺便说一句,你不需要List类。节点就是列表。