我的列表结构如下:
struct Node {
Node *next;
Node *prev;
T datum;
};
Node *first; // points to first Node in list, or 0 if list is empty
Node *last; // points to last Node in list, or 0 if list is empty
我试图做以下事情:
void pop_front()
{
//copied from lecture slides
assert(!empty());
Node *victim = first;
first = first->next;
if(first != 0)
{
first->prev = 0;
}
delete victim;
victim=0;
}
问题是,当我执行删除受害者行时,它会给我一个内存泄漏。我不知道出了什么问题。
编辑:这就是我添加节点的方式:
//MODIFIES: this
//EFFECTS: inserts i into the front of the list
void pushit_tofront(const T &datum)
{
//if list is empty, update both the first and last element
//copied from lecture slides
Node *p = new Node;
p->datum = datum;
p->next = first;
if(empty())
{
first = last = p;
}
else
{
first = p;
}
}
答案 0 :(得分:0)
尝试将此代码用于节点
class Node {
public:
int get() { return object; }; // returns the value of the element
void set(int object) { this->object = object; }; // set the value of the element
Node* getNext() { return nextNode; }; // get the address of the next node
void setNext(Node* nextNode) // set the address of the next node
{ this->nextNode = nextNode; };
Node* getPrev() { return prevNode; }; // get the address of the prev node
void setPrev(Node* prevNode) // set the address of the prev node
{ this->prevNode = prevNode; };
private:
int object; // it stores the actual value of the element
Node* nextNode; // this points to the next node
Node* prevNode; // this points to the previous node
};
双重链接列表看起来像是未完成的。但你只需在其中添加删除功能。
class DoublyList
{
public:
List();
void add (int addObject);
int get();
bool next();
void start();
void remove();
private:
int size;
Node * headNode;
Node * currentNode;
Node * lastCurrentNode;
};
双重链接列表删除它将从任何位置删除。如果条件对你有所帮助,你已经询问了最后两个节点的第一个节点。
DoublyList::remove(){
Node *removeNode= currentNode;
if((currentNode->getNext()!=null)&&(currentNode->getprev())!=headNode)){ // it will remove the node in middle
lastCurrentNode->setNext(currentNode->getNext());
(currentNode->getNext())->setPrev(currentNode->getPrev);
currentNode= currentNode->getNext();
}
if((currentNode->getprev())!=headNode)&&(currentNode->getNext()==null)){ // it will remove the node if it is last node
lastCurrentNode->setNext(null);
currentNode= lastCurrentNode;
lastCurretnNode= currentNode->getPrev();
}
if((currentNode->getprev())==headNode)&&(currentNode->getNext()==null)){ //if it is at the start and next node is null
headNode->setNext(null);
lastCurrentNode= headNode;
currentNode= headNode;
}
if((currentNode->getprev())==headNode)&&(currentNode->getNext()!=null)){ //if it is at the start and next node is not null
headNode->setNext(currentNode->getNext());
(currentNode->getNext())->setPrev(headNode);
lastCurrentNode= headNode;
currentNode= currentNode->getNext();
}
delete removeNode;
size--;
}
我认为您正在尝试使用双向链接列表进行堆栈。但你的问题并不清楚。所以我已经在所有条件下编写了删除方法。我没有测试过这段代码。你必须自己做。如果你有任何错误可以联系我。
答案 1 :(得分:-2)
关于学术诚实问题,我不打算发布解决方案,因为这是一项受欢迎的作业。
但是,我会给你一些指示:)
任何时候你做一个双向链表的变异你(在你的情况下)最多有六个指针需要担心。
curr->next = ?
curr->prev = ?
next->prev = ?
next->next = ?
head = ?
tail = ?
如果您明确确保所有指针都得到妥善管理,您可能会解决当前的问题。