C ++堆栈实现,而不是在函数中保留内存

时间:2013-08-11 18:52:18

标签: c++ memory-management stack

您好我想编写堆栈实现,遗憾的是出了问题

CPP FILE

  Node* head=0;

std::cout << "front insertion" << std::endl;
addBeg(head, 1);
std::cout<<head<<std::endl;

HEADER FILE

class Node
{public:
    int value;
    class Node *next_el;
    Node(int value){ this->value=value;next_el=NULL;}
};

void addBeg(Node *head, int value){
head=new Node(value); //even that doesn't work!?
}

我真的很想知道为什么main中的“head”仍然是NULL值; 我做错了什么?

3 个答案:

答案 0 :(得分:1)

您可以通过更改标题来解决这个问题,但这是不道德的:

void addBeg(Node * &head, int value){
  head=new Node(value); // now it works
}

在代码中以相同的方式调用这两个版本。以这种方式改变一个函数(通过引用而不是按值来取一个参数)可能真的让用户感到高兴,但我想在这种情况下并不重要。

答案 1 :(得分:0)

如果你想编写自己的链表实现(而不仅仅是使用已经存在的内容,比如std :: list),我建议你首先看看链接列表在C中是如何工作的(不是C ++)。可以在此处找到教程,例如:http://www.codeproject.com/Articles/24684/How-to-create-Linked-list-using-C-C

一旦你在C中工作,你可以尝试在它周围编写一个C ++“包装器”作为类或模板。除此之外,你的问题不够准确,无法知道你的清单应该如何运作。

答案 2 :(得分:0)

您只在addBeg()函数内修改指针值,但是您想要更改变量的值。提醒我,当我有类似的问题,我的老师说“如果它不起作用,添加星号”

所以这是:

class Node
{public:
    int value;
    class Node *next_el;
    Node(int value){ this->value=value;next_el=NULL;}
};

void addBeg(Node **head, int value){
*head=new Node(value); //even that doesn't work!?
}

Node* head=0;
std::cout << "front insertion" << std::endl;
addBeg(&head, 1);//notice &
std::cout<<head<<std::endl;

另一种解决方案是使用@ Beta的答案

中所示的参考