[英]c++ Set insertion numbers check for duplicates
我的任務是寫一個set類。 首先我有一個具有功能的節點類
void list_head_insert(node<Item>*& head_ptr, const Item& entry)
{
head_ptr = new node<Item>(entry, head_ptr);
}
這會在開始處插入一個節點
我有兩個set函數,第一個函數檢查插入的數字是否存在。 如果是,則返回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;
}
}
第二個set函數使用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)
... etc並嘗試打印數字時,它不會將其打印出來。 我已經檢查了包含功能,它可以正常工作。 我認為問題出在插入物中,但我不知道為什么。
最初,您的新集合為空。 當您嘗試插入第一個元素時,您的代碼將通過調用set<Item>::contains()
來檢查其是否已經存在。
此時, head_ptr
仍為NULL
(假設構造空集時已正確初始化了它)。 在set<Item>::contains()
的while條件下,不幸的是,通過執行head_ptr->data()
取消了對NULL指針的引用。 這是未定義的行為:
還要注意,如果您設法在集合中插入所有內容,那么下次您調用contain()
,可以將head_ptr
更改為指向最后一個節點...
重寫函數set<Item>::contains()
:
{
for (auto p=head_ptr; p; p = p->link() )
if(p->data()==target)
{
return true;
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.