c++实现链表的问题
Problem in implementing a linkedlist in c++
我正在学习 C++ 并尝试实现单链表。基本上是一个链表,提供两种简单的方法,插入和显示。下面是代码片段 --
class LinkedList {
public:
int data;
LinkedList *next;
LinkedList() {
}
LinkedList(int d) {
data = d;
}
void insert(int d) {
LinkedList temp = *this;
cout << "Calling insert "<< temp.data;
while (temp.next != NULL) {
cout << "Inside the while loop"<< temp.data;
temp = *temp.next;
}
temp.next = new LinkedList(d);
}
void display() {
LinkedList temp = *this;
cout << temp.data;
while (&temp != NULL) {
cout << temp.data;
temp = *temp.next;
cout << temp.data;
}
}
};
int main()
{
LinkedList head(1);
head.insert(2);
head.insert(3);
head.insert(4);
head.display();
return 0;
}
但是,此插入方法未按预期工作。即使在多次调用 insert 之后,它也永远不会进入 while 循环,并且永远不会打印“Inside the while loop”。你能指导我的插入方法有什么问题吗?
您必须改进不止一件事才能保留代码 运行。
在构造函数中初始化next的值。否则你无法确定下一次创建 LinkedList
时设置为 NULL
LinkedList(int d) : data(d), next(NULL) {}
使用 LinkedList*
而不是 LinkedList
作为 temp
类型。否则,您将不会修改列表节点,而是修改第一个节点的本地副本。请注意:
LinkedList temp = *this;
必须替换为 LinkedList* temp = this;
- 所有出现的
temp.next
都必须替换为 temp->next
- 所有出现的
temp.data
都必须替换为 temp->data
display
函数中的 while 条件必须替换:&temp != NULL
-> temp != NULL
必须删除 display
函数中 while 循环的第三行,因为 temp
可能指向 NULL
。
次要的是您没有在输出中换行。请确保在您希望换行的地方添加 << endl
。
最大的问题是您仍然必须为 LinkedList
实现析构函数以释放分配的资源。根据 rule of three,对于析构函数,您还应该定义复制构造函数和赋值运算符。
另一种方法是使用像std::unique_ptr
这样的智能指针来存储下一个节点的地址。
#include <iostream>
#include <memory>
using namespace std;
class LinkedList {
public:
int data;
std::unique_ptr<LinkedList> next;
LinkedList(int d) : data(d) {}
void insert(int d) {
LinkedList* temp = this;
cout << "Calling insert "<< d << std::endl;
while (temp->next) {
cout << "Inside the while loop: "<< temp->data << std::endl;
temp = temp->next.get();
}
temp->next = std::make_unique<LinkedList>(d);
}
void display() {
LinkedList* temp = this;
while (temp != NULL) {
cout << temp->data << std::endl;
temp = temp->next.get();
}
}
};
int main()
{
LinkedList head(1);
head.insert(2);
head.insert(3);
head.insert(4);
head.display();
return 0;
}
我正在学习 C++ 并尝试实现单链表。基本上是一个链表,提供两种简单的方法,插入和显示。下面是代码片段 --
class LinkedList {
public:
int data;
LinkedList *next;
LinkedList() {
}
LinkedList(int d) {
data = d;
}
void insert(int d) {
LinkedList temp = *this;
cout << "Calling insert "<< temp.data;
while (temp.next != NULL) {
cout << "Inside the while loop"<< temp.data;
temp = *temp.next;
}
temp.next = new LinkedList(d);
}
void display() {
LinkedList temp = *this;
cout << temp.data;
while (&temp != NULL) {
cout << temp.data;
temp = *temp.next;
cout << temp.data;
}
}
};
int main()
{
LinkedList head(1);
head.insert(2);
head.insert(3);
head.insert(4);
head.display();
return 0;
}
但是,此插入方法未按预期工作。即使在多次调用 insert 之后,它也永远不会进入 while 循环,并且永远不会打印“Inside the while loop”。你能指导我的插入方法有什么问题吗?
您必须改进不止一件事才能保留代码 运行。
在构造函数中初始化next的值。否则你无法确定下一次创建
LinkedList
时设置为NULL
LinkedList(int d) : data(d), next(NULL) {}
使用
LinkedList*
而不是LinkedList
作为temp
类型。否则,您将不会修改列表节点,而是修改第一个节点的本地副本。请注意:LinkedList temp = *this;
必须替换为LinkedList* temp = this;
- 所有出现的
temp.next
都必须替换为temp->next
- 所有出现的
temp.data
都必须替换为temp->data
display
函数中的 while 条件必须替换:&temp != NULL
->temp != NULL
必须删除
display
函数中 while 循环的第三行,因为temp
可能指向NULL
。
次要的是您没有在输出中换行。请确保在您希望换行的地方添加 << endl
。
最大的问题是您仍然必须为 LinkedList
实现析构函数以释放分配的资源。根据 rule of three,对于析构函数,您还应该定义复制构造函数和赋值运算符。
另一种方法是使用像std::unique_ptr
这样的智能指针来存储下一个节点的地址。
#include <iostream>
#include <memory>
using namespace std;
class LinkedList {
public:
int data;
std::unique_ptr<LinkedList> next;
LinkedList(int d) : data(d) {}
void insert(int d) {
LinkedList* temp = this;
cout << "Calling insert "<< d << std::endl;
while (temp->next) {
cout << "Inside the while loop: "<< temp->data << std::endl;
temp = temp->next.get();
}
temp->next = std::make_unique<LinkedList>(d);
}
void display() {
LinkedList* temp = this;
while (temp != NULL) {
cout << temp->data << std::endl;
temp = temp->next.get();
}
}
};
int main()
{
LinkedList head(1);
head.insert(2);
head.insert(3);
head.insert(4);
head.display();
return 0;
}