1

私は多かれ少なかれ単一のリンクリストの背後にある基本的な考え方を理解していますが、二重にリンクされたリストに要素を挿入するのに問題があります。基本的に、前のポインタと次のポインタを適切なノードにリンクするのに問題があります。助けてくれてありがとう。これが私のコードの様子です。

LinkedList.h

template <class T>
class LinkedList{
      protected:
        LinkedListNode<T>* head;
      public:
        LinkedList():head(NULL){}
        ~LinkedList();
        void insert(const T& x);
};


//inserting
template <class T>
void LinkedList<T>::insert(const T& x) {
 LinkedListNode<T>* head = new LinkedListNode<T>(head->prev, x, head->next);
 if(head != NULL){
         head->prev = head->next;
         head->next = head;
  }       
}

LinkedListNode.h

class LinkedListNode{
      protected:
        LinkedListNode<T>* prev;
        T value;
        LinkedListNode<T>* next;
        LinkedListNode(LinkedListNode<T>* p, const T& x, LinkedListNode<T>* n):prev(p), value(x), next(n) {}
        ~doublyLinkedListNode();
        template <class S> friend class doublyLinkedList;
};

挿入機能を次のように変更してみましたが、セグメンテーション違反が発生しました。私の実装の何が問題になっていますか?

template <class T>
void LinkedList<T>::insert(const T& x) {
 LinkedListNode<T>* head;
 if(head == NULL){
        head->value = x;
        head->prev = NULL;
        head->next = head;

 }
else{   LinkedListNode<T>* newnode;
        newnode->value = x;
        newnode->prev = head->next;
        newnode->next = newnode;
        head = newnode;
 }
4

1 に答える 1

1

あなたは可変シャドウイングの被害者です。

元のバージョンを見てみましょう。

//inserting
template <class T> void LinkedList<T>::insert(const T& x) {
   LinkedListNode<T>* head = new LinkedListNode<T>(head->prev, x, head->next);
   // ...

関数の最初の命令を分析します。

   LinkedListNode<T>* head; // not initialized value
   new LinkedListNode<T>(head->prev, x, head->next); // oh oh....

headは新しい変数であり、元の変数this->headは影になっています。ただし、この問題を修正しても、イニシャルthis->headはそのままNULLであるためthis->head->prev、セグメンテーション違反が発生します。2 番目のバージョンで後者を修正しますが、まだ問題があるだけです。

テンプレート

void LinkedList<T>::insert(const T& x) {
 LinkedListNode<T>* head; // #1
 if(head == NULL){
        // #2
        head->value = x;
        head->prev = NULL;
        head->next = head;

 }
else{   LinkedListNode<T>* newnode;
        newnode->value = x;
        newnode->prev = head->next; // #3
        newnode->next = newnode;    // #3
        head = newnode;
 }

最初のエラー ( #1) は、やはり可変シャドウイングです。#2頭にメモリを割り当てていないため、これもセグメンテーション違反です。

#3論理エラーです。前のノードはヘッド自体である必要があり、ノードの次のノードはノード自体であってはなりません。

于 2012-10-06T16:49:14.997 に答える