单链表搜索

Singly Linked Lists search

我正在尝试创建一个搜索功能,该功能将通过我的节点查找具有相同给定参数的节点,但我似乎无法理解如何执行此操作。我的节点(元素)由指针 next_、T color_ 和字符串 name_ 组成。我需要 return 与我找到的节点和前一个节点配对。如果未找到或没有以前的,则为 nullpointer。

template<typename T>
pair<Element<T>*, Element<T>*> PAL<T>::find(string name){
    pair<Element<T>*, Element<T>*> *result = nullptr;
    Element<T>* x = nullptr;
    Element<T>* y = nullptr;
    for (Element<T> *n = back_; n != nullptr; n = n -> next_){
        if (n -> name_ == name){
            Element<T>* x = Element<T>(n -> name_, n -> color_);
            result.first = x;
            result.second = y;
            break;
        }
        Element<T>* y = Element<T>(n -> name_, n -> color_);
    }
    return result;
}

这是我第一次做这些列表,所以我不知道我在做什么。我感谢任何形式的帮助,如果需要,我可以提供更多信息! 谢谢!

您在滥用 std::pair 和一般的指针。

此外,“如果未找到或没有以前的,return null”,第二个要求并不真正对通用搜索功能有意义!您真的要忽略列表中的第一个节点吗?

如果是这样,请尝试类似这样的操作:

template <typename T>
struct Element
{
    Element* next_;
    T color_;
    std::string name_;
};

template <typename T>
class PAL
{
public:
    //...
    std::pair<Element<T>*, Element<T>*> find(std::string name);

private:
    Element<T> *head_; // pointer to FIRST element
};

template <typename T>
std::pair<Element<T>*, Element<T>*> PAL<T>::find(std::string name)
{
    Element<T> *previous = nullptr;

    for (Element<T> *node = head_; node != nullptr; node = node->next_)
    {
        if (node->name_ == name)
        {
            if (previous != nullptr)
                return std::make_pair(node, previous);

            break;
        }

        previous = node;
    }

    return std::make_pair<Element<T>*>(nullptr, nullptr);
}

或者:

template <typename T>
std::pair<Element<T>*, Element<T>*> PAL<T>::find(std::string name)
{
    if (head_ != nullptr)
    {
        Element<T> *previous = head_;

        for (Element<T> *node = head_->next; node != nullptr; node = node->next_)
        {
            if (node->name_ == name)
                return std::make_pair(node, previous);

            previous = node;
        }
    }

    return std::make_pair<Element<T>*>(nullptr, nullptr);
}

但是,如果你真的不想忽略第一个节点,那么试试这个(如果前一个节点为空,让调用者决定做什么):

template <typename T>
std::pair<Element<T>*, Element<T>*> PAL<T>::find(std::string name)
{
    Element<T> *previous = nullptr;

    for (Element<T> *node = head_; node != nullptr; node = node->next_)
    {
        if (node->name_ == name)
            return std::make_pair(node, previous);

        previous = node;
    }

    return std::make_pair<Element<T>*>(nullptr, nullptr);
}