2011-05-17 69 views
0

嘿傢伙, 我正在爲期中期研究現在正在努力嘗試使用單鏈表創建一個簡單的程序。我想要做的只是在列表中插入「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

注意:這是命名約定區分成員變量的原因之一,因爲它是牽引或導致_,m_或任何地方的平衡是黑白信息和美學。

+0

非常感謝,這個固定它! – pauliwago 2011-05-17 04:06:29

+3

@paul:或者使用一個初始化列表(應該是這樣),並且可以保持名稱相同。 – GManNickG 2011-05-17 04:15:04

+0

@Gman:+1給初始者;應該這樣說我自己。 – Keith 2011-05-17 04:35:08

1

嗯,我想的data兩個實例中

data = data; 

是局部的,所以node的數據成員從來沒有得到任何分配給它的東西。打印什麼是未定義的值,而不是地址。無論如何,這在風格上是可怕的;這裏有很多約定,但對於類成員來說,好的一個是_data,對於函數參數是data。做出這個簡單的改變,看看是否沒有解決你的問題。

6

構造函數node中存在缺陷。參數data與名爲data的memeber變量衝突。這應該解決它:

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

更好的選擇是重命名參數爲別的。另外考慮使用initialization list

node::node(int d) : data(d), next(NULL) { }