-2

我不确定为什么我正在编写的 DL 列表中的这个 find 函数不起作用。问题是 tempNode->data 和 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;};
    };
4

3 回答 3

3

除了你有内存泄漏的事实,你似乎在这里比较指针:

if(tempNode->data == theSong) { .... }

你可能需要类似的东西

if(*(tempNode->data) == s) { .... }

你真的不需要动态分配的指针绑定到theSong. 此外,参数 tofind应该是一个const参考:

bool DoublyLinkedList::find(const string& s)
//                          ^^^^^

通常,您应该将遍历链表与在其中查找元素分离。否则,您会发现自己在很多地方都复制了遍历代码错误。

于 2013-09-09T23:42:39.260 回答
1

您正在比较两个不同字符串对象的地址。改为使用string::compare或比较这些值。

另外,为什么要从已经存在的字符串创建一个新字符串?

if (s.compare(tempNode->data) == 0)或者s == *(tempNode->data)可能是你想要做的。

于 2013-09-09T23:43:18.687 回答
0

我想写这个作为评论,但我没有足够的声誉这样做。

您绝对不应该比较字符串的地址,而是比较字符串本身(至少在您的情况下)。还要注意字符串大小写比较,并确保指定是否要进行区分大小写或不区分大小写的比较。

除此之外,您不需要创建临时字符串对象,并且可以使用传递给函数的形式参数本身。即使您曾经想创建临时变量,也应该考虑使用 shared_ptr 或 unique_ptr 以避免内存泄漏。

Stephan T Lavavej 最近有一个关于 Going Native 的精彩演讲,我建议你观看。现在该网站已关闭,当网站再次返回时,我可以添加指向它的链接。

我还将形式参数设为 const 以确保您不会意外修改输入参数。

于 2013-09-09T23:56:49.830 回答