【发布时间】:2017-07-14 20:12:41
【问题描述】:
开始:这是家庭作业的一部分,所以请随意提示答案或指出正确的方向,而不是直接回答。
我在 c++ 中创建一个单链表,其中一个必需的函数是 void remove(const T& key),如果值与传递给函数的键的值匹配,则删除给定节点。
我目前的想法是,我必须首先,找到要删除的节点,找到要删除的节点之前的节点,然后找到要删除的节点之后的节点。从那里我可以删除需要删除的节点,并将前一个节点设置为指向已删除节点之后的节点。
以下是相关功能:
LinkedList.h
//Returns the node with passed in value key
ListNode<T>* find(const T& key) {
ListNode<T>* currentNode = _head;
while(currentNode != NULL && currentNode->data() != key){
currentNode = currentNode->next();
}
return currentNode;
}
//Returns the node before the key
ListNode<T>* findPreviousNode(const T& key){
ListNode<T>* previousNode;
ListNode<T>* currentNode = _head;
while(currentNode != NULL && currentNode->data() != key){
previousNode = currentNode;
currentNode = currentNode->next();
}
return previousNode;
}
// Removes and deletes the first node in the linked list that has data
// equal to the key
void remove(const T& key) {
ListNode<T>* nodeToDelete = find(key);
ListNode<T>* previousNode = findPreviousNode(key);
ListNode<T>* nextNode = nodeToDelete->next();
delete nodeToDelete;
previousNode->setNext(nextNode);
}
我已经对我的find(const T& key) 函数进行了广泛的测试,并且它可以正常工作,所以我相信问题出在我的 findPreviousNode 函数中,但是当我浏览代码时,它似乎工作正常。
在我看来,previousNode 将始终具有最后检查的元素,当找到匹配项时,它会返回尚未更新的 previousNode,因此它仍然包含直接在匹配节点之前的节点,但这显然不是正确,我不知道为什么。当我运行代码时,我得到一个
分段错误(核心转储)
错误信息
这里有一些包含完整代码的粘贴箱:
LinkedList.h http://pastebin.com/b4miZBzA
main.cpp(调用测试函数的方法)http://pastebin.com/0QGtUhjC
【问题讨论】:
标签: c++ data-structures linked-list