【发布时间】:2014-03-04 13:23:58
【问题描述】:
我对 C++ 和它的数据结构相当陌生。我为我的双向链表类创建了一些函数,但我在删除函数中遇到了麻烦。我创建了一个 deleteHead() 函数,它删除列表中的第一个节点,一个 deleteTail() 函数,它删除列表中的最后一个节点,最后一个 deleteElement(Item) 函数遍历列表并删除具有那里面的Item。
问题是每当我尝试从列表中删除唯一剩余的节点时,程序就会崩溃。即如果我插入一个节点,然后我在同一个节点上调用 deleteElement 函数(如果我插入的节点是列表中唯一的节点)程序崩溃。
这是我的代码。
template <class T>
void LinkedList<T>::deleteElement(T item)
{
ListItem<T>* current = head;
ListItem<T>* temp;
if (head == NULL) { // if list is empty end the function
return;
}
while (current) {
if (current->value == item) {
if (current == head) { // if item is in the head
deleteHead();
}
else if (current == getTail()) { // if item is in the tail
deleteTail();
}
// if item is between two nodes
else if (current != head && current != getTail()) {
temp = current;
temp->prev->next = temp->next;
temp->next->prev = temp->prev;
current->next = NULL;
current->prev = NULL;
if (current->next == NULL) {
deleteTail();
}
}
}
current = current->next;
}
}
// Delete the Head Node
template <class T>
void LinkedList<T>::deleteHead()
{
if (head != NULL) { // as long as head is not null, delete head
ListItem<T> *current = head;
head = head->next;
current->next = NULL;
head->prev = NULL;
} else {return;} // if head is null, end the function without doing anything
}
// Delete Tail Node
template <class T>
void LinkedList<T>::deleteTail()
{
ListItem<T> *tail = getTail();
tail = tail->prev;
tail->next->prev = NULL;
tail->next = NULL;
}
【问题讨论】:
-
您是否尝试过调试您的代码?
-
很可能在
deleteHead()中使用head = head->next;,如果列表只包含一个元素,则必须是NULL,在这种情况下head->prev = NULL;会崩溃。