2011-05-17 68 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) { }