2016-03-05 65 views
0

我的任務是編寫一個集合類。 首先我有具有功能C++設置插入號碼檢查重複項

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

建議 - 不要將類命名爲'set',因爲C++有一個'std :: set'類。 – PaulMcKenzie

+0

酷感謝生病請記住@PaulMcKenzie – NBera

回答

0

最初,您的新設置爲空。當您嘗試插入第一個元素時,您的代碼將通過調用set<Item>::contains()來檢查它是否已經存在。

此時,head_ptr仍然是NULL,(假設您在構建空集時已經正確初始化了它)。在set<Item>::contains()的while條件中,你不幸地通過做head_ptr->data()來解引用空指針。這是未定義的行爲:

  • 在最好的情況下,你的代碼會得到一個段錯誤,你的代碼將不會做任何事情。而不是打印任何東西!
  • 在其他情況下,你的函數可能最終返回任何東西,包括true,使你的代碼相信沒有東西可以插入。

還要注意的是,如果你將設法在您所設定的所有塞入任何東西,下一次你會打電話contain(),你woud改變head_ptr指向最後一個節點...

重寫你的函數set<Item>::contains()

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

我愛你男人謝謝^ _ ^我一直在看一個小時的代碼,但你知道他們說別人可以看到你沒有LOL的錯誤。 – NBera