2013-08-26 40 views
0

我需要爲數據結構創建一個自定義的雙向鏈表。重複(自定義)雙向鏈表的第一個元素

但列表的第一個元素重複,我看不到我的錯誤。

這是我的push_back功能:

template <class DT> 
void List<DT>::push_back(const DT& elem) 
{ 

    if(First->Back == nullptr && First->Forward == nullptr) { 

     First->Current = elem; 


     Last->Current = elem; 
     Last->Back = First; 

     First->Forward = Last; 

     return; 
    } else { 


     ListObject<DT> *temp = new ListObject<DT>(*Last); 

     Last = new ListObject<DT>(); Last->Back = temp; Last->Forward = nullptr; Last->Current = elem; 
     temp->Back->Forward = temp; 
     temp->Forward = Last; 

    } 

} 

List<int> c; 

    c.push_back(66); 
    c.push_back(44); 
    c.push_back(88); 
    c.push_back(58); 

    std::cout << "---------------------------" << std::endl; 
    for(ListObject<int> *a = c.First; a; a = a->Forward) { 

     std::cout << a->Current << std::endl; 
    } 

編輯這裏是我的ListObject類

template <class LDT> 
class ListObject { 

public : 

    ListObject* Back; 
    LDT Current; 
    ListObject* Forward; 

    ListObject(const LDT& elem, ListObject& _back, ListObject& _forward) { 

     Back = &_back; 
     Current = elem; 
     Forward = &_forward; 


    } 

    ListObject() { 
     Back = nullptr; 
     Forward = nullptr; 
    } 

    ListObject(const ListObject& lista) { 

     Back = lista.Back; 
     Current = lista.Current; 
     Forward = lista.Forward; 
    } 

    ~ListObject() { 

     delete Back; 
     delete Forward; 
     Current; 
    } 

    ListObject<LDT> MakeList(const LDT& elem, ListObject& _back, ListObject& _forward) { 

     return ListObject<LDT>::ListObject(elem, _back, _forward); 
    } 

    void assing(LDT elem) { 

     Current = elem; 

    } 

    bool HasForward() { 

     if(Forward != nullptr) {return true;} else{return false;} 
    } 



}; 
+0

爲什麼插入一個元素時在else子句中有兩個分配?你似乎泄漏了最後一個'Last'。 –

回答

1

與修改您的else子句:

ListObject<DT> *temp = Last; 

Last = new ListObject<DT>(); Last->Back = temp; Last->Forward = nullptr; Last->Current = elem; 
temp->Forward = Last; 

這將修復你的內存泄漏。

也通過更換if語句:

if(First == nullptr) { //list is empty 

     First = new ListObject(); 
     First->Current = elem; 

     First->Back = nullptr; 
     First->Forward = nullptr; 

     Last = First; //last IS also first, do not duplicate 

     return; 
} 

這將解決重複的第一個元素。

+0

謝謝,我已經修改了它,但是,第一個元素仍反覆'無效列表

::的push_back(const的DT&ELEM) { 如果(第一 - >返回== nullptr &&第一 - >轉發== nullptr){ First-> Current = elem; Last-> Current = elem; Last - > Back = First; First-> Forward = Last; return; } else { ListObject
* temp = Last; Last = new ListObject
(); Last-> Back = temp; Last-> Forward = nullptr; Last-> Current = elem; temp-> Forward = Last; } }' – user1519426

+0

更改if條款,請參閱我編輯的答案。 – Michael

+0

現在感謝它的工作。 – user1519426

1

正如Neil所說,在將第一項添加到列表中時,您正在將值分配給First和Last。恕我直言,最後一次應該是沒有(空)

我相信第一個項目可能只出現兩次在列表中。