【问题标题】:Pointer Problems in LinkedList C++链表 C++ 中的指针问题
【发布时间】:2023-03-13 11:03:01
【问题描述】:

所以,我尝试将我的 Java 版本的链表移植到 C++ 中,但我在使用指针指向正确的对象时遇到了很大的困难。 remove遍历和reverse traverse的目的就是简单的把链表的值依次打印出来,然后倒序打印出来。这是代码。我发布大部分而不是某些部分的原因是因为我相信您需要它的上下文。

控制台输出: 他们是平等的 删除 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;


}

【问题讨论】:

  • 我不太清楚为什么不使用内置的 STL 容器。也许使用Standard Containers 会更容易,比如List&lt;T&gt;。

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


【解决方案1】:

你的问题是,如果你说:

Node temp(data);

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

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

【讨论】:

  • 绝对正确。我认为即使没有分配指针,它仍然可以工作。很久没用过C++了。谢谢你的帮助!这解决了它。
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 2020-05-28
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多