使用了各种搜索引擎(以及出色的stackoverflow数据库),我发现了一些类似的情况,但是它们要么复杂得多,要么不像我那样复杂试图完成。
C 列表循环使用模板链接错误C :链接列表排序指针地址不会在链接列表中更改
我正在尝试使用链接列表和节点模板来存储和打印非标准类对象(在这种情况下,是分类的联系人的集合)。特别是,我想从具有不同类别的对象中打印出具有相同类别的多个对象。按类别打印时,我将sub-object tmpCategory(=" butiness")与分类联系人的类别部分进行比较。
但是如何提取这些数据以在int main()?
中进行比较这就是我的想法。我在linklist.tem中创建一个getItem成员函数,这将初始化指针光标,然后运行a for循环,直到函数输入与迭代号匹配。此时,GetItem使用(光标 ->数据)返回对象类型。
template <class Type>
Type LinkList<Type>::GetItem(int itemNumber) const
{
Node<Type>* cursor = NULL;
for(cursor = first;
cursor != NULL;
cursor = (cursor -> next))
{
for(int i = 0; i < used; i++)
{
if(itemNumber == i)
{
return(cursor -> data);
}
}
}
}
这是int main()进出的位置。我将比较对象tmpCategory设置为某个值(在这种情况下为" butiness")。然后,我运行一个用于循环的循环,该循环的循环等于我拥有的节点数(由函数getSused()确定)。在该循环中,我使用当前迭代号码调用GetItem。从理论上讲,这将使int主循环从linklist.tem返回相应的节点。从那里,我从该节点数据(当前有效)的对象中调用类别,该类别将与TMPCategory进行比较。如果有匹配,则循环将打印整个节点的数据对象。
tmpCategory = "Business";
for(int i = 0; i < myCategorizedContact.GetUsed(); i++)
{
if(myCategorizedContact.GetItem(i).getCategory() == tmpCategory)
cout << myCategorizedContact.GetItem(i);
}
问题是当前的设置(虽然它确实运行),但根本没有返回。在进行进一步测试后(cout&lt;&lt; myCategorizedContact.getItem(i).getCategory()),我发现它只是一遍又一遍地打印出第一个节点的类别。我希望总体方案对每个节点进行评估并打印出匹配的数据,而不仅仅是吐出相同的节点。
任何想法/建议都非常感谢。
请仔细查看此:
template <class Type>
Type LinkList<Type>::GetItem(int itemNumber) const
{
Node<Type>* cursor = NULL;
// loop over all items in the linked list
for(cursor = first;
cursor != NULL;
cursor = (cursor -> next))
{
// for each item in the linked list, run a for-loop
// counter from 0 to (used-1).
for(int i = 0; i < used; i++)
{
// if the passed in itemNumber matches 'i' anytime
// before we reach the end of the for-loop, return
// whatever the current cursor is.
if(itemNumber == i)
{
return(cursor -> data);
}
}
}
}
您不是在列表itemNumber
乘以沿列表中行走。第一项cursor
参考将启动内部循环。循环索引到达ItemNumber的那一刻您返回。如果链接列表中至少具有itemNumber
项目。。实际上,其中两个(光标和ItemNumber)与您的实现完全无关。并且要真正添加讽刺意味,因为used
和cursor
完全无关,如果used
比itemNumber
少于少,则始终是如此,因为used
在cursor
通过外部循环时不会改变。因此,cursor
最终变为null,并且此函数的结果不确定(无返回值)。总而言之,如书面,您将始终返回第一个项目(如果itemNumber < used
)或不确定的行为,因为您没有返回值。
我相信您需要以下内容:
template< class Type >
Type LinkList<Type>::GetItem(int itemNumber) const
{
const Node<Type>* cursor = first;
while (cursor && itemNumber-- > 0)
cursor = cursor->next;
if (cursor)
return cursor->data;
// note: this is here because you're definition is to return
// an item COPY. This case would be better off returning a
// `const Type*` instead, which would at least allow you to
// communicate to the caller that there was no item at the
// proposed index (because the list is undersized) and return
// NULL, which the caller could check.
return Type();
}