2011-03-12 48 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 

using namespace std; 

class Node{ 
    public: 
    int data; 
    Node * next; 
}; 

void Append(Node * head, int newdata){ 
    Node * n = head; 
    if(n->next != NULL) 
    { 
    n = n->next; 
    } 
    n->data = newdata; 
    cout<<"data-> "<<newdata<<" inserted!"<<endl; 
} 

void Display(Node * head){ 
    Node * n = head; 
    if(n->next != NULL) 
    { 
    cout<<"data->"<<n->data<<endl; 
    n = n->next; 
    } 
    cout<<"data->"<<n->data<<endl; 
} 
int main(int argc, char * argcv[]) 
{ 
    Node * headnode; 
    int newdata = 20; 
    Append(headnode, newdata); 
    Display(headnode); 
    return 0; 
} 

这个程序的输出是:单独链接列表的headnode是否有默认值?

data-> 20 inserted! 
data->1 
data->20 

为什么headnode已经在这里指定为 “1” 的数据成员?

+4

'headnode'未初始化并包含随机数据。 – Erik 2011-03-12 21:40:37

+3

我很惊讶该计划甚至没有segfaulting运行。下一个节点也不会被初始化。 – GWW 2011-03-12 21:46:47

+0

甚至没有下一个节点。噢亲爱的! – 2011-03-13 08:18:49

回答

1

除了注释之外,这里的问题是,您正在发送一个指向附加函数中的节点的指针,而没有初始化它所包含的数据和指针。

if(n->next != NULL)里面追加,n->next也是随机数据,这意味着您将赋值20不是“头”,而是指向头指向的节点。

这就是打印时值20在下一个节点上的原因,并且(在本例中为1)的随机值位于头节点中。

您需要使用new来分配内存中的节点,因为解除引用未指向分配内存的指针很可能会导致段错误。

1

除了@米兰的评论和回答,我认为Node可以更好的实现设计。并不总是需要公开数据成员(即Node::data),特别是在这种情况下。类Node也可以有附加新链接并显示链接列表的成员函数。要想到一个想法,请考虑容器std :: list的实现方式(即其成员函数)。利用强大的功能,数据隐藏,在C++