0

新しいスレッドを開始する必要があるかどうかはわかりませんが、前の質問を編集するとコードの再配置が大幅に増えるため、新しいスレッドが最適だと思います。

template <class T>
class node {
public:
    T value;
    node<T> *next;
    node<T> *previous;  
};

template <class T>
class my_list {
public:
    node<T> *first;
    node<T> *last;
    my_list(){
        first = NULL;
        last = NULL;
    }
    ~my_list(){
    }
    void push_back(T val);
    void push_front(T val);
    void pop_back();
    void pop_front();
    T front();
    T back();
};

以上がクラス編成です。以下は、リストの最後のノードを削除する pop_back() メソッドです。私はそれを働かせることができません。実行されますが、T back() 関数を呼び出すとランダムな値が返されるため、最後のノードが再割り当てされないようです。

template <class T>
void my_list<T>::pop_back(){
    node<T> oldlast = *this->last;
    node<T> newlast = *oldlast.previous;
    cout << newlast.value << endl;
    newlast.next = NULL;
    this->last = this->last->previous;
}  


template <class T>
void my_list<T>::push_back(T val){
    if (this->first == NULL) {
    node<T> newnode;
    newnode.value = val;
    newnode.next = NULL;
    newnode.previous = NULL;
    this->first = &newnode;
    this->last = &newnode;
} else {
    node<T> current = *this->last;
    node<T> newnode;
    newnode.value = val;
    newnode.previous = &current;
    newnode.next = NULL;
    current.next = &newnode;
    this->last = &newnode;
}
}

template <class T>
void my_list<T>::push_front(T val){
if (this->first == NULL) {
    node<T> newnode;
    newnode.value = val;
    newnode.next = NULL;
    newnode.previous = NULL;
    this->first = &newnode;
    this->last = &newnode;
} else {
    node<T> current = *this->first;
    node<T> newnode;
    newnode.value = val;
    newnode.previous = NULL;
    newnode.next = &current;
    current.previous = &newnode;
    this->first = &newnode;
}

}

4

1 に答える 1

1

問題は、ローカルnode<T>変数を作成し、それらにポインターを割り当てることです。関数が終了すると、それらのローカル変数は範囲外になり、ポインターは無効になります。の場合pop_back、次の行でリストの最後の 2 つの要素のコピーを作成します。

node<T> oldlast = *this->last;
node<T> newlast = *oldlast.previous;

したがって、newlast次の行での次のポインターを変更すると

newlast.next = NULL;

実際の要素ではなく、実際にcopyを変更しています。したがって、オブジェクト自体をコピーする代わりに、ポインタをオブジェクトにコピーしてから、必要に応じて次のように変更.する->必要があります。

template <class T>
void my_list<T>::pop_back(){
    node<T> *oldlast = last;
    node<T> *newlast = oldlast->previous;
    cout << newlast->value << endl;
    newlast->next = NULL;
    last = newlast;
    delete oldlast;
}

push_backpush_frontはローカル変数であるためnewnode、関数が終了すると破棄されます。代わりに、動的に割り当てる必要があります( unique_ptrnewなどのスマート ポインターを使用するのがさらに良いですが、これはおそらく使用できないコース用であると想定しています)。このように作成する必要がありますnewnode

node<T>* newnode = new node<T>;

はポインターであるためnewnode、すべてを に再度変更する必要があり.ます->。また、このノードをで割り当てているため、メモリ リークを避けるためnewに で割り当てを解除する必要があります。deleteしたがって、pop_back関数では、リストから削除する要素 (delete oldlast;行) を削除する必要があります。

于 2013-05-06T17:36:48.653 に答える