簡體   English   中英

C ++設置插入號檢查重復項

[英]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指針的引用。 這是未定義的行為:

  • 在最佳情況下,您的代碼會出現段錯誤,並且您的代碼將無法執行其他任何操作。 而且什么都不打印!
  • 在其他情況下,您的函數可能最終返回任何內容(包括true),從而使您的代碼認為沒有可插入的內容。

還要注意,如果您設法在集合中插入所有內容,那么下次您調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM