在我的双向链接列表中断开查找功能

时间:2013-09-09 23:41:03

标签: c++

我不确定为什么我在写的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;};
    };

3 个答案:

答案 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,以确保不会意外修改输入参数。