2017-09-24 6 views
-2

データ構造クラスの単純なリンクリストを作成していますが、ヘッドポインタがどのように動作するのかを理解できません。リンクされたリストヘッドC++

私は

template <typename E> 
class SSLL{ 
template<typename E> 
     struct Node { 
      E data; 
      Node* next; 
     }; 
public: 
template <typename E> 
    SSLL(); 
    void push_front(E element); 
private: 
    Node<E> * head; 
    Node<E> * tail; 
}; 
template <typename E> 
SSLL<E>::SSLL() { 
    head = NULL; 
    tail = NULL; 
} 
template <typename E> 
void SSLL<E>::push_front(E element) { 
    Node<E> * n = new Node<E>; 
    n->data = element; 
    n->next = head; 
    head = n; 
    if (!tail) { 
     tail = n; 
    } 
} 

しかし、このメイクではなく、最初の要素へのポインタのリストの最初の要素を頭しませんしています。

push_front(E要素)をこれに変更しようとしましたが、nullポインタエラーが発生しました。

template <typename E> 
void SSLL<E>::push_front(E element) { 
    Node<E> * n = new Node<E>; 
    n->data = element; 
    n->next = head->next; 
    head->next = n; 
    if (!tail) { 
     tail->next = n; 
    } 
} 

私は頭を持っている= Nが、私はまだそれが代わりに頭部>次= n個のものと同様である理由を理解悩みを持ってオンラインで見つけるすべての例。

ありがとうございます。

+1

グラスを取得するには、デバッガを1行ずつ実行する必要がありますp何が起こっているか。 – user0042

+1

リンクされたリストをデバッグするためのもう1つのすばらしいツールは、ペンとペーパーです。私はあなたがいない。吸盤を描く。ノードを描画します。一度に1つずつ変更すると、リストを操作後に新しい設定に再構成します。あなたがコード内で行っていることへのリストの変換を視覚化し、それに応じてコードを調整するために行ったことを比較してください。 – user4581301

+0

それは読むのがはるかに簡単です。 'head'が' NULL'のときにリストに最初に挿入されたときに 'head-> next'がどうなるか自問してください。 – user4581301

答えて

1

は、リンクリストのほとんどの形態では、ヘッドポインタリスト内の最初のノードへのポイントかがnullの場合:

  +---+  +---+  +--+ 
head --> | A | --> | B | --> |/0| 
     +---+  +---+  +--+ 
        ^ 
        | 
tail ----------------+ 

多くの初心者がノードでリストを混乱させる。ノードはデータを含むオブジェクトです。リストはノードの集まりです。ヘッドノードに新しいノードポイントを作る

  1. :フロントで挿入ヘッド
    で押す

    は、以下の手順が必要です。

  2. 新しいノードを指すようにヘッドノードを変更します。新しいノードへのヘッドポイントを作る)

      +---+ 
    p_new -->| C | 
         +---+ 
          | 
          V 
         +---+  +---+  +--+ 
    head --> | A | --> | B | --> |/0| 
         +---+  +---+  +--+ 
    

    2:

1)ノードを頭に新しいノードポイントを作る

:C++で

  +---+ 
p_new -->| C | 
head -->| | 
     +---+ 
      | 
      V 
     +---+  +---+  +--+ 
     | A | --> | B | --> |/0| 
     +---+  +---+  +--+ 

、これは次のようになります。

Node * p_node = new Node; 
p_node->next = head; // Step 1. 
head = p_node; // Step 2. 
関連する問題