【发布时间】:2013-12-17 20:23:06
【问题描述】:
所以我试图在 C++ 中创建一个模板链接列表类。一切都很完美,包括有问题的 remove() 和 search(),除非我对不在 LinkList 中的值调用这两种方法。理想情况下,我希望方法在发现值不在 list 之后返回,但是,我觉得这些方法会继续并尝试进一步删除或搜索值,因为当我运行可执行文件时,我得到“分段错误(核心转储)”错误。如果在空列表上调用方法,程序将打印正确的错误。
列表与头单独链接,并使用“智能节点”(即包含自己的方法以补充匹配的类方法的节点,而不是不包含任何方法并要求类方法的“哑节点”来实现)创建指向节点的临时指针并遍历列表)。
这里是 search() 和 remove() 的实现。当然,如果需要,我可以提供更多代码:
//==========================REMOVE================================
template <class T>
void TLinkedList<T> :: remove(T value){
if(!head){ //if there is no head
std::cerr << "Error: List is Empty" << std::endl; // The list is empty
return;
}
if(head->data == value){
listSize--; //decremenets listSize since a node is removed
node * temp = head;
head = head->next;
delete head;
return;
}
else{
if(head->remove(value)){ //If something was removed as a result of the node's remove()
listSize--;
return; //decrement listSize since something was removed
}
else{ //else if nothing removed
std::cerr << "Error : Value not in list" << std::endl;
return;
}
}
}
template <class T>
bool TLinkedList<T> :: node :: remove(T value ){ //returns a bool. If something was removed, returns true. If nothing was removed, returns false
if(next-> data == value){
node * temp = next;
next = next->next;
delete temp;
return true; //something removed
}
if(!next){
return false;
}
else{
return next -> remove(value);
}
}
//==============SEARCH===================
template <class T>
T TLinkedList<T> :: search(T value){
if(!head){
std::cerr << "Error: List is empty" << std::endl;
return 0;
}
if(head->data == value){ //If head's data is the value searched for
return head->data; //return head's data
}
else{
return head->search(value);
}
}
template <class T>
T TLinkedList<T> :: node :: search(T value){
if(data == value){
return data;
}
if(!next){
std::cerr << "Error: Value not in list" << std::endl;
return 0;
}
else{
return next->search(value);
}
}
所以,对于 main(),例如:
int main(){
TLinkedList ll;
ll.prepend(5); //adds 5 to list
ll.remove(4); // value of 4 not in list
// OR ll.search(4);
return 0;
}
cerr 没有发生,并且给出了“Segmentation Fault (core dumped)”错误。
非常感谢任何帮助。谢谢!
编辑:另外,在 search() 方法中,您可能会注意到我返回 0;发生错误时。此实现是在遇到错误时尝试停止该方法;理想情况下,如果遇到错误,我宁愿搜索不返回任何内容
【问题讨论】:
-
您应该让您的搜索函数返回包含正在搜索的元素的节点,如果未找到该元素,则返回
nullptr。然后你的删除将简单地调用搜索然后删除元素
标签: c++ linked-list