关于链表的指针问题

时间:2011-09-25 20:17:39

标签: c++ linked-list sorted

好吧,伙计们,所以我一直在研究链接列表程序,我遇到了一个问题。我正在尝试以排序的方式将一段数据放入已排序的链表中。现在,我正在将用户给出的指针数据(Data * newData)与头部(LinkNode * current = head)进行比较,我知道我的程序失败了。我知道我必须比较实际值,而不是内存地址,但我不确定如何去做。任何人都有任何建议或想法?

感谢。

void addSorted(Data * newData)
{
    if(head == NULL)
    {
        head = new LinkNode(newData);
        return;
    }
    LinkNode * current = head;
    LinkNode * previous = NULL;
    while(current != NULL)
    {
        if(newData->compareTo(current->data) == -1)
        {
            LinkNode * newNode = new LinkNode(newData);
            newNode->next = current;
            if(previous == NULL)
            {
                current->next = newNode;
            }
            else
            {
                newNode->next = previous->next;
                previous->next = newNode;
            }
            return;
        }
        previous = current;
        current = current->next;
    }
    previous->next = new LinkNode(newData);
}

4 个答案:

答案 0 :(得分:3)

简单地

    if(*newData < (*current->data))     

假设运营商&lt;为数据类型重载

提供std :: less&lt;&gt;的最小惯用方法兼容的弱总排序(I.o.w.实现运算符&lt;):

struct Data
{
    int id;
    std::string other;

    // details omitted

    bool operator<(const Data& b) const
    {
         if (id < rhs.id)
             return true;
         if (id > ths.id)
             return false;
         return (other < b.other);
    }
};

如果你有一个大/复杂的结构,所有参与的成员都为他们的类型定义了比较,你可以用TR1,Boost或C ++ 11元组做这个巧妙的技巧:

    #include <tuple>

    // ...

        bool operator<(const Data& b) const
        {             
             return std::tie(id,other)< std::tie(b.id,b.other);
        }

答案 1 :(得分:1)

在你的while循环中你将newData(它是一个指针)与“current-&gt; data”进行比较,这是一个整数(我猜)?

即。 if(newData&lt; current-&gt; data)

答案 2 :(得分:0)

您可以使用memcmp来比较您的数据

答案 3 :(得分:0)

if(newData < current->data)

应该是

if(*newData < current->data)

我猜。 如果没有运算符&lt;,则执行它或使用慢速memcmp。

另外,如果这是一个实用的代码(为什么不使用stl?),请考虑使用skip lists - 它们会更快。

PS:运营商是一个强大的功能,请毫不犹豫地使用它们。