我不确定为什么我在写的DL列表中找到这个函数是行不通的。问题是tempNode->数据和s之间的比较失败了。尽管数据相同,但比较评估为假。谁知道为什么?
bool DoublyLinkedList::find(string& s)
{
if(empty())
return false;
else
{
Node* tempNode = head;
do{
if(*(tempNode->data) == s)
{
return true;
}
tempNode = tempNode->next;
} while(tempNode != NULL);
return false;
}
}
class Node
{
public:
Node* next;
Node* prev;
string* data;
Node(){next = NULL; prev = NULL; data = NULL;};
~Node(){delete prev; delete next; delete data; next = NULL; prev = NULL; data = NULL;};
};
答案 0 :(得分:3)
除了你有内存泄漏的事实,你似乎在这里比较指针:
if(tempNode->data == theSong) { .... }
你可能需要像
这样的东西if(*(tempNode->data) == s) { .... }
您确实不需要绑定到theSong
的动态分配指针。此外,find
的参数应为const
引用:
bool DoublyLinkedList::find(const string& s)
// ^^^^^
通常,您应该遍历链接列表以及在其中查找元素。否则你会发现自己在许多地方复制遍历代码错误。
答案 1 :(得分:1)
您正在比较两个不同字符串对象的地址。请改用string::compare
或比较值。
另外,为什么要从现有字符串创建新字符串?
if (s.compare(tempNode->data) == 0)
或s == *(tempNode->data)
可能就是您想要做的。
答案 2 :(得分:0)
我想把它写成评论,但我没有足够的声誉来这样做。
你绝对不应该比较字符串的地址,而是比较字符串本身(至少在你的情况下)。还要注意字符串大小写比较,并确保指定是否要进行区分大小写或不区分大小写的比较。
除此之外,您不需要创建临时字符串对象,并且可以使用传递给函数的形式参数本身。 即使您曾想创建临时变量,也应考虑使用shared_ptr或unique_ptr来避免内存泄漏。
Stephan T Lavavej最近就Going Native发表了精彩的演讲,我建议你观看。现在网站已关闭,我可以在网站重新出现时添加链接。
我还会将形式参数设为const,以确保不会意外修改输入参数。