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;}
    }



};
4

2 に答える 2

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;
}

これにより、重複した最初の要素が修正されます。

于 2013-08-26T06:24:41.137 に答える
1

ニールが言ったように、リストに最初の項目を追加する際に、First と Last に値を割り当てています。私見ラストカレントは何もないはずです(null)

最初の項目は、リストに 2 回しか存在しない可能性があると思います。

于 2013-08-26T06:25:06.207 に答える