gpt4 book ai didi

c++ - 在使用链接列表实现的堆栈中删除节点->日期的位置

转载 作者:行者123 更新时间:2023-11-28 00:43:56 24 4
gpt4 key购买 nike

当我实现 pop() 和包含节点的堆栈的析构函数时,我应该在删除节点本身之前删除 node->data 还是应该只删除节点并让创建 node->data 的调用者删除节点->数据?如果让调用者这样做,调用者应该何时以及如何删除数据?它应该以这种方式调用:{data = stack.top();删除数据; stack.pop();}?

我没有看到任何删除节点->数据的代码,无论是在 pop() 的实现中还是在调用函数中。这就是我感到困惑的原因。

在这里,我复制了我使用链接列表实现的堆栈。请查看 pop() 和 ~stack() 的注释以解决我的问题。感谢您的帮助。

typedef struct Node_t{
struct Node_t* next;
void* data;
}Node;

class stack {
public:
stack(): _head(null), _size(0){}
~stack();
void push(void* data);
void pop();
void* top();
bool empty();
stack(const stack& original);
stack& operator=(const stack& original);
private:
Node* _head;
int _size;
};
stack::~stack{
Node* next = null;
while(_head){
next = _head->next;
//should delete _head->_data???
delete _head;
_head = next;
}
_size = 0;
}
void stack::push(void* data){
Node* elem = new Node;
elem->data = data;
elem->next = _head;
_head = elem;
_size++;
}

void stack::pop(){
Node* next = NULL;
if (_head) {
next = _head->next;
//should delete _head->_data???
delete _head;
_head = next;
_size--;
}
}

void* stack::top() const{
if (_head) {
return _head->_data;
}
}

bool stack::empty(){
if(_size>0) return false;
else return true;
}

最佳答案

您的数据是指向其他地方的指针。这里的策略是:在堆栈外创建一个数据对象,并将数据指针插入堆栈。因此,通过对称性,删除数据的控件也应该存在于您的堆栈之外。如果不需要它,则需要明确删除它。例如:

stack s;
char mydata[] = {'a','b','c'};
s.push((void*)mydata);
//do things
s.pop();
delete [] mydata;

如果你真的想控制栈里面的数据(通过它可能不是一个好主意,假设你的数据可能在其他地方使用),也有一个问题。因为数据类型是 void* 并且您可能无法“安全”地删除它。查看此线程 Is it safe to delete a void pointer?

关于c++ - 在使用链接列表实现的堆栈中删除节点->日期的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17353895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com