堆栈上的链接列表

时间:2015-02-25 21:09:05

标签: c++

通常,我们定义一个结构或类节点,每当我们必须向链表添加新链接时,我们通常会动态创建一个新节点,对吗?

像这样:

node* temp = new node(x);

如果我们想要在堆栈上创建新链接而不是堆,该怎么办? 这样做了吗?

node temp(x);

这是一个足够安全的做法吗?因为我看到人们一直在堆上创建一个节点而从不在堆栈本身上。

现在,当我们删除链接时,如果我们在堆栈上创建了列表,那么我们不必使用delete / free运算符/函数,对吧?我们需要做的就是调整链接指针。

我试图在这里实现的是否有任何缺陷?

2 个答案:

答案 0 :(得分:0)

您需要注意的问题是链接。如果您的Node看起来像

class Node
{
    int data;
    Node* next;
}

如果您制作两个节点:

Node a{5, nullptr};
Node b{5, &a};

如果由于某种原因a b超出了b之前的范围(在上面的示例中它没有赢,但你可以想象一个案例),那么{{1}}就有了{{1}}悬空参考。

当在堆上声明节点时,您可以显式处理链接被插入,移除,创建和销毁的顺序。

答案 1 :(得分:0)

如果从函数返回但保留对分配为局部变量

的节点的引用,则会出现问题

考虑这个(不好的例子):

#include <iostream>

class Node {
public:
    int v; 
    Node* next;
};

void b(Node*node){
    Node b{2,nullptr};
    node->next=&b;
}

void a(void){
    Node top{1,nullptr};
    b(&top);

    std::cout<<top.next->v<<std::endl;//<-- INVALID! Lifetime of b has ended.
}

int main(void){
    a();
    return 0;
}