2013-08-26 41 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。恕我直言,最后一次应该是没有(空)

我相信第一个项目可能只出现两次在列表中。