好吧,伙计们,所以我一直在研究链接列表程序,我遇到了一个问题。我正在尝试以排序的方式将一段数据放入已排序的链表中。现在,我正在将用户给出的指针数据(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);
}
答案 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:运营商是一个强大的功能,请毫不犹豫地使用它们。