用于使用模板循环链接列表



使用了各种搜索引擎(以及出色的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)与您的实现完全无关。并且要真正添加讽刺意味,因为usedcursor完全无关,如果useditemNumber少于少,则始终是如此,因为usedcursor通过外部循环时不会改变。因此,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();
}

相关内容

  • 没有找到相关文章

最新更新