打印链表。我究竟做错了什么?

时间:2011-03-06 04:32:30

标签: c list pointers

我在以下代码中遇到了分段错误:

void print_stack(Node * root) {
   while(root != NULL) {
     // print the node
     root = root->next;
   }
}

虽然这有效:

int print_stack(Node ** root) {

   Node * tmp = *root;

   while(*root != NULL) {
     // print the node
     *root = (*root)->next;
   }

   *root = tmp;
}

问题是我做错了什么?对于这两个函数,我将Node指针的地址传递给列表的头部。我试图让第一个函数工作,因为它看起来更理想(没有指针分配,也没有永久更改根指针)..谢谢。

编辑:我在此处发布了代码:http://dpaste.com/477724/

3 个答案:

答案 0 :(得分:1)

您传递了Node指针的地址,而该函数只接受了一个Node指针。

此:

print_stack(&main);

应该是这样的:

print_stack(main);

答案 1 :(得分:0)

发布所有代码,显示链接列表的初始化 - 似乎应该可以正常工作。

class Node
{
public:
   Node();
   Node *next;
};

Node::Node()
{
   next = NULL;
}

void print_stack(Node * root) 
{    
   while(root != NULL) 
   {      // print the node     
      root = root->next;    
   } 
}

int _tmain(int argc, _TCHAR* argv[])
{
   Node *root = new Node();
   Node *begin = root;
   for (int i=0;i<10;i++)
   {
      Node *pNew = new Node();
      root->next = pNew;
      root = pNew;
   }
   print_stack(begin);
    return 0;
}

答案 2 :(得分:0)

您在链接中发布的程序中存在编译错误。

错误1: int print_stack(Node * root)应该返回int。但它的定义并没有这样做。

错误2:在切换案例中,在调用print_stack时,应该传递类型Node*而不是Node**的参数。所以,它应该是print_stack(main);

错误3:case u切换功能中,推送功能参数应为push(&main, &d);