我的双向链表中的查找函数损坏

Broken Find Function in my Doubly Linked List

本文关键字:函数 损坏 查找 双向链表 我的      更新时间:2023-10-16

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

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

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

你可能需要类似的东西

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

您确实不需要绑定到theSong的动态分配指针。此外,要find的参数应该是const引用:

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

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

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

另外,为什么要从现有字符串创建新字符串?

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

我想

把它写成评论,但我没有足够的声誉来这样做。

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

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

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

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