我为链表编写了以下课程.添加新节点(addValue1和addValue2)有两个单独的功能.一个使用指针到节点,另一个不使用.
#include <stdlib.h>
#include <iostream>
class linkedList{
private:
struct Node {
int data;
Node* next;
};
Node* head;
public:
linkedList(){
//constructor
this->head = NULL;
}
~linkedList(){
//destructor
}
void addValue1(int n) {
Node* newNode = new Node();
newNode->data = n;
newNode->next = head;
this->head = newNode;
}
void addValue2(int n) {
Node newNode;
newNode.data = n;
newNode.next = head;
this->head = &newNode;
}
void print(){
Node* curNode = this->head;
while(this->head != NULL) {
std::cout << curNode->data << " "<< std::endl;
curNode = curNode->next;
}
}
};
int main() {
linkedList llist;
llist.addValue2(5);
llist.addValue1(4);
llist.addValue1(9);
llist.print();
}
Run Code Online (Sandbox Code Playgroud)
推荐这两个中的哪一个,为什么?这两者有什么区别吗?如果我们不使用new运算符,我们以后不需要使用delete运算符.这似乎对我有利.是真的吗?
addValue2因为你要存储一个指向newNode具有自动存储持续时间的节点的指针,所以会造成严重破坏.一旦超出范围,指针&newNode将悬空.
繁荣!
请注意,如果编译器会为您做什么,那么显式编写析构函数也是不合时宜的.如果你需要引入析构函数,virtual然后编写它
virtual ~linkedList() = default;
Run Code Online (Sandbox Code Playgroud)
在你的情况下,虽然你需要delete分配的节点,new否则你的类将泄漏内存.
最后,如果您根本不想担心内存,请使用
typedef linkedList std::list;
Run Code Online (Sandbox Code Playgroud)
然后前往酒吧.