2011-05-17 7 views
0

Hey guys 私は現在中期的に勉強しており、単一リンクリストを使用して簡単なプログラムを作成しようとしています。私がしたいのは、リストに "1"、 "2"、 "3"、 "4"を挿入して印刷するだけです。次のコードを見てみてください:単一リンクリストC++

#include <iostream> 
#include <string> 
using namespace std; 

class node{ 
public: 
    node(int data); 
    friend class slist; 
private: 
    int data; 
    node *next; 
}; 

node::node(int data){ 
    data = data; 
    next = NULL; 
} 

class slist{ 
public: 
    slist(){ 
     head = NULL; 
    } 
    void insert(int item); 
    void output(); 

private: 
    node* head; 
}; 

void slist::insert(int item){ 
    node* newnode = new node(item); 
    if(head == NULL) 
    { 
     head = newnode; 
    } 
    else 
    { 
     newnode->next = head; 
     head = newnode; 
    } 
} 

void slist::output(){ 
    node* p = head; 
    while (p->next != NULL){ 
     cout << p->data << " "; 
     p = p->next; 
    } 
    cout << p->data << " "; 
} 

int main(){ 
    slist FINAL; 

    FINAL.insert(1); 
    FINAL.insert(2); 
    FINAL.insert(3); 
    FINAL.insert(4); 

    FINAL.output(); 

    return 0; 
} 

をそれは罰金コンパイルが、それはポインタの代わりに、実際の数字を(私は推測している)を出力します。なぜ誰かが私に言うことができますか?

ありがとうございます!

答えて

3
node::node(int data) { 
    data = data; 
    next = NULL; 
} 

data = dataは問題です。パラメーターをメンバーと異なる名前に変更します。これは、メンバ変数dataの一連のガベージ値(ポインタではありません)を与えるべきです。

注:これは、メンバーの変数を区別する命名規則の理由の1つであり、それは口頭または先導_m_または残高が情報と審美性である場合に限ります。

+0

ありがとう、これは固定です! – pauliwago

+3

@paul:または初期化リストを使用してください(同じように)名前を同じにすることができます。 – GManNickG

+0

@Gman:イニシャライザの場合+1。私はそう言っていたはずです。 – Keith

1

まあ、私はdata

data = data; 

の両方のインスタンスがローカルだと思います。したがって、nodeのデータメンバーには何も割り当てられません。印刷されるのは、アドレスではなく、未定義の値です。いずれにせよ、それは様式的にひどいものです。ここでは多くの規約がありますが、クラスメンバーの場合は_data、関数の引数の場合はdataです。その単純な変更を行い、問題が解決しないかどうかを確認します。

6

nodeコンストラクタにバグがあります。引数dataは、メンバ変数dataと競合します。これで修正する必要があります:

より良いオプションは、引数の名前を変更することです。 initialization listを使用することを検討してください:

関連する問題