首页 > 解决方案 > C++ InsertAtFront 中的链表

问题描述

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

#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->

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

标签: c++

解决方案


在您的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;
    }

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

底线,去掉int第一行开头的 ,以便它指的是正确的data

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

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

  • 尽量减少从库中带入命名空间的内容(使用std::cout而不是using namespace std
  • 意识到完全公共class的只是 a struct,并且可以将大部分公共class构建为 a struct,最后只需要一些私有的东西;
  • 使用默认参数值以提供灵活性,同时仍然保持简单(例如允许next在构造 a 时指定指针MyNode);
  • 根据需要使用初始化而不是代码来设置成员字段;
  • 使用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();
}

推荐阅读