c++ - C++ 中的链表 InsertAtFront

标签 c++

我在使用这段代码时遇到问题:

#include<iostream>
using namespace std;
class node {
    public:
    int data;
    node*next;

    node(int d) {
        int data = d;
        next = NULL;
    }
};
void InsertAtFront(node*&head, int data) {
    node*n = new node(data);
    if(head == NULL) {
        head = n;
    } else {
        n->next = head;
        head = n;
    }
}
void print(node*head) {
    node*temp = head;
    while(temp != NULL) {
        cout<<temp->data<<"->";
        temp = temp->next;
    }
    cout<<endl;
}
int main() {
    node*head = NULL;
    InsertAtFront(head,5);
    InsertAtFront(head,4);
    InsertAtFront(head,2);
    InsertAtFront(head,3);
    InsertAtFront(head,1);
    print(head);
}

输出结果

0->0->0->0->0->

为什么会这样? 当我创建一个链接列表类时它工作得很好,但它不是这样工作的。

最佳答案

在您的 node 类中(具体来说,在构造函数中):

public:
    int data;         // This is your object data.
    node *next;
    node(int d) {
        int data = d; // This data is NOT your object data.
        next=NULL;
    }

您正在创建一个名为data全新本地 变量并将d 分配给它,留下对象 data 变量设置为构造函数启动之前的任何值。然后您的本地 data 超出范围,然后您继续并使用您的对象data

最重要的是,去掉第一行开头的 int,以便它指向正确的 data:

node(int d) {
   data = d; // This data IS your object data.
   next=NULL;
}

而且,虽然这解决了您的问题,但您仍然可以做很多事情来改进您的代码,例如:

  • 尽量减少从库中引入命名空间的内容(使用 std::cout 而不是 using namespace std)
  • 意识到一个完全公开的只是一个结构,并且一个大部分公开的可以构建为一个结构 最后是一些一些私有(private)的东西;
  • 使用默认参数值以允许灵 active ,同时仍然保持简单(例如允许在构造 MyNode 时指定 next 指针);
  • 根据需要使用初始化而不是代码来设置成员字段;
  • 使用nullptr而不是NULL
  • 在代码中使用一致的命名;
  • 也使用一致的风格(缩进、大括号等);
  • 使列表本身成为一个类,这样您就可以在不影响 API 的情况下轻松更改底层实现;
  • 学习使用 C++ 的现代特性,例如基于范围的 for

以下完整程序显示了您的代码以及所做的改进。

#include <iostream>
using std::cout;

struct MyNode {
    int m_data;
    MyNode *m_next;
    MyNode(int data, MyNode *next = nullptr) : m_data(data), m_next(next) {}
};

struct MyList {
    MyList() : m_head(nullptr) {}
    void InsertAtFront(int data) {
        MyNode *node = new MyNode(data, m_head);
        m_head = node;
    }

    void Print() {
        if (m_head == nullptr) {
            cout << "<empty>\n";
            return;
        }
        cout << m_head->m_data;
        MyNode *node = m_head->m_next;
        while (node != NULL) {
            cout << " -> " << node->m_data;
            node = node->m_next;
        }
        cout << "\n";
    }

private:
    MyNode *m_head;
};

int main() {
    MyList xyzzy;

    for (int x : {5, 4, 2, 3, 1}) {
        xyzzy.InsertAtFront(x);
    }
    xyzzy.Print();
}

关于c++ - C++ 中的链表 InsertAtFront,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51916905/

相关文章:

C++ 应用程序使用 mmap 通过 PCI 在用户区与 FPGA 通信

C++ : String + integer path

c++ - 模板化静态成员函数是如何解析的?

c++ - 将 C 函数数组转换为 C++ 函数指针数组?

c++ - 为什么派生类不使用基类 operator=(赋值运算符)?

c++ - std::hash 是否保证在 stdlib 发行版中相同

c++ - 如何保存 Visual Studio C++ 调试 session 的状态?

c++ - 当且仅当语句不编译时,我可以编写成功的测试吗?

c++ - 删除列表中的结构元素

c++ - Borland 断言在 local_unwind() 中失败