gpt4 book ai didi

C++ 自定义列表删除节点

转载 作者:行者123 更新时间:2023-11-28 07:37:46 26 4
gpt4 key购买 nike

我不确定我是否应该开始一个新线程,但由于编辑我之前的问题会涉及大量重新排列代码,我认为最好是一个新线程。

template <class T>
class node {
public:
T value;
node<T> *next;
node<T> *previous;
};

template <class T>
class my_list {
public:
node<T> *first;
node<T> *last;
my_list(){
first = NULL;
last = NULL;
}
~my_list(){
}
void push_back(T val);
void push_front(T val);
void pop_back();
void pop_front();
T front();
T back();
};

上面是类布局。下面是 pop_back() 方法,它应该删除列表中的最后一个节点。我无法让它工作。它运行但似乎没有重新分配最后一个节点,因为当我调用 T back() 函数时它返回一个随机值。

template <class T>
void my_list<T>::pop_back(){
node<T> oldlast = *this->last;
node<T> newlast = *oldlast.previous;
cout << newlast.value << endl;
newlast.next = NULL;
this->last = this->last->previous;
}


template <class T>
void my_list<T>::push_back(T val){
if (this->first == NULL) {
node<T> newnode;
newnode.value = val;
newnode.next = NULL;
newnode.previous = NULL;
this->first = &newnode;
this->last = &newnode;
} else {
node<T> current = *this->last;
node<T> newnode;
newnode.value = val;
newnode.previous = &current;
newnode.next = NULL;
current.next = &newnode;
this->last = &newnode;
}
}

template <class T>
void my_list<T>::push_front(T val){
if (this->first == NULL) {
node<T> newnode;
newnode.value = val;
newnode.next = NULL;
newnode.previous = NULL;
this->first = &newnode;
this->last = &newnode;
} else {
node<T> current = *this->first;
node<T> newnode;
newnode.value = val;
newnode.previous = NULL;
newnode.next = &current;
current.previous = &newnode;
this->first = &newnode;
}

最佳答案

问题是您正在制作本地 node<T>变量并为它们分配指针。当函数结束时,那些局部变量超出范围并且您的指针不再有效。在pop_back的情况下, 你复制列表中最后两个元素的行

node<T> oldlast = *this->last;
node<T> newlast = *oldlast.previous;

所以当你修改newlast的下一个指针与线

newlast.next = NULL;

您实际上是在修改拷贝,而不是实际元素。因此,与其复制对象本身,不如复制指向对象的指针,然后更改 .->根据需要:

template <class T>
void my_list<T>::pop_back(){
node<T> *oldlast = last;
node<T> *newlast = oldlast->previous;
cout << newlast->value << endl;
newlast->next = NULL;
last = newlast;
delete oldlast;
}

对于 push_backpush_front , newnode是局部变量,因此在函数结束时被销毁。相反,您必须使用 new 动态分配它(更好的方法是使用智能指针,例如 unique_ptr,但我假设这是针对您可能无法使用它的类(class))。您应该创建 newnode像这样

node<T>* newnode = new node<T>;

newnode是一个指针,你必须再次更改所有 .-> .此外,由于您正在使用 new 分配此节点, 你必须用 delete 解除分配它以避免内存泄漏。所以在你的pop_back函数,您必须删除要从列表中删除的元素(delete oldlast; 行)。

关于C++ 自定义列表删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16403634/

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