1

你好我想写堆栈实现,不幸的是出了点问题

文件

  Node* head=0;

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

头文件

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 值;我做错了什么?

4

3 回答 3

1

您可以通过更改标题来解决此问题,但它是卑鄙的:

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

两个版本在代码中的调用方式相同。以这种方式更改函数(通过引用而不是通过值获取参数)确实会绊倒用户,但我想在这种情况下它并不重要。

于 2013-08-11T19:15:35.357 回答
0

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

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

于 2013-08-11T19:13:13.903 回答
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 的答案中所示的参考

于 2013-08-11T20:34:57.167 回答