c++ - 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->
为什么会这样?当我创建一个链表类时它工作得很好,但它不是这样工作的。
解决方案
在您的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
) - 意识到完全公共
class
的只是 astruct
,并且可以将大部分公共class
构建为 astruct
,最后只需要一些私有的东西; - 使用默认参数值以提供灵活性,同时仍然保持简单(例如允许
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();
}
推荐阅读
- javascript - 发送未定义(建议命令)
- python - for-loop 在 python 中是如何工作的
- python - 根据标准匹配将数据从数据帧的早期部分传输到后面的部分
- arrays - 在 Excel 工作簿中搜索多个字符串
- linux - 当最后一个 Linux 终端退出/终止时,如何以编程方式触发操作?
- powerbi - 是否可以在 Power BI 中通过用户输入更改 OData 查询?
- rust - 具有多个生命周期参数的迭代器的 impl Iterator 失败
- google-drive-api - 在 Google 云端硬盘上找不到占用大量存储空间的文件
- django - 当用户单击 Django admin 中选定的自动完成字段选项时,如何显示相关对象弹出窗口?
- java - 表和实体映射的休眠查询异常