c ++设置插入数字检查重复项

时间:2016-03-05 18:38:38

标签: c++ data-structures linked-list set

我的任务是写一个集合类。 首先,我有一个具有函数

的节点类
void list_head_insert(node<Item>*& head_ptr, const Item& entry)
{
    head_ptr = new node<Item>(entry, head_ptr);
}

这会在开头插入一个节点

我有两个设置功能,第一个检查是否存在插入的数字。如果是,则返回true,否则返回false。

template <class Item>
bool set<Item>::contains(const Item& target)
{
   while(head_ptr->data()!=target&&head_ptr->link()!=NULL)
      head_ptr=head_ptr->link();

    if(head_ptr->data()==target)
    {
        return true;
    }
    else
    {
        return false;
    }
}

第二个设置函数使用list_head_insert函数

插入节点
template <class Item>
void set<Item>::insert(const Item& entry)
   // Library facilities used: node2.h
{
    if(contains(entry) !=true)
    {
        list_head_insert(head_ptr, entry);//inserts node
        ++many_nodes;//increases the number of items
    }
}

最后我有一个打印功能

 void print(set<int>bagints)
 {
    for(bag<int>::iterator cursor = bagints.begin(); cursor != bagints.end();   ++cursor)
    {
        cout<<*cursor<< " ";
    }
}

当我插入数字示例列表Mylist.insert(10) ...等并尝试打印数字时,它不打印出来。我检查了包含功能,它可以正常工作。我认为问题在插入,但我无法弄清楚为什么。

1 个答案:

答案 0 :(得分:0)

最初,您的新设置为空。当您尝试插入第一个元素时,您的代码将通过调用set<Item>::contains()来检查它是否已存在。

目前,head_ptr仍为NULL,(假设您在构建空集时已正确初始化它)。在set<Item>::contains()的while条件下,您不幸地通过执行head_ptr->data()取消引用NULL指针。这是未定义的行为:

  • 在最好的情况下,您的代码会出现段错误,而您的代码将不会执行任何其他操作。而不是打印任何东西!
  • 在其他情况下,您的函数可能最终返回任何内容,包括true,使您的代码相信没有任何内容可以插入。

另请注意,如果您设法在集合中插入任何内容,则下次拨打contain()时,您需要将head_ptr更改为指向最后一个节点... < / p>

重写你的函数set<Item>::contains()

{
for (auto p=head_ptr; p; p = p->link() ) 
    if(p->data()==target)
    {
        return true;
    }
return false; 
}