2012-03-26 7 views
0

リンクリストのコードを記述しようとしていますが、ノードを追加しようとするとadd()関数のwhileループの直後にコードがスタックしてしまいます。アクセス違反エラー。どうしましたか?アクセス違反 - 場所への書き込みができません

#include<iostream> 

template <class T> 
class linkedlist 
{ 
    struct node 
    { 
     T data; 
     node *lp; 
    }*p; 
public: 
    linkedlist(); 
    void add(T t); 
}; 

template<class T> 
void linkedlist<T>::add(T t) 
{ 
    node *r,*q; 
    r = q = p; 

    while(p!= NULL) 
    { 
     q = p; 
     p = p->lp; 
    } 

    q->lp = new node; 
    q->lp->data = t; 
    p = r; 
} 

template<class T> 
linkedlist<T>::linkedlist() 
{ 
    p = NULL; 
} 

int main() 
{ 
    linkedlist<int> l1; 
    l1.add(3); 
} 

答えて

1

あなたは(q経由)addでデリファレンスにしてみてください、その後、コンストラクタでNULLpを初期化します。

r = q = p; 
// the while loop will not be executed as p == NULL 
q->lp = new node; 

あなたが最初p初期化する必要があります - その場合、あなたの「空」のリストに(建設中にいずれかを物理的に空ではないため、具体的に処理しなければなりません(例えば、要素の反復処理時)。p == nullの場合はaddにチェックインして別の方法で処理する必要があります。

サイドノート:pは、あなたの頭の要素を指すようになって、(rに格納されている)元の値を復元し、その後、addでリストを反復するためにも、それを使用するのは危険です。単にそれをそのまま残しておき、反復にはrを使用してください。バグの可能性が1つ少なくなります。

0

あなたは、コンストラクタ内のノードを初期化する必要があります。

p = new Node; 

ここにいるので:

while(p!= NULL) 
{ 
    q = p; 
    p = p->lp; 
} 

q->lp = new node; 

pが最初NULLので、qNULLなり、エルゴq->lpにつながります定義されていない動作とcras h。

pを初期化するか、ロジックを再考してください。

+0

*ノードをコンストラクタで初期化する必要があります。*、NO、**メンバー初期化リスト**で行う必要があります。 –

+0

@Alsはコンストラクタの一部ではありませんか? :P –

+0

あなたが言及したコードステートメントは、メンバー初期化リストに追加できますか?それはできません、それはコンストラクタbody.Soだけあなたの答えとあなたのコメントに接することができます。 –

関連する問題