我在使用这段代码时遇到问题:
#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/