2010-01-04 96 views
1

我想打印链接列表的反转。我正在通过递归来完成它。但是,在函数读取中调用read(temp)时,会发出BUS ERROR。链接列表中的递归

任何原因为什么会发生这种情况?

#include <iostream> 

using namespace std; 

struct node 
{ 
    int info; 
    node *next; 
}; 

void read(node *start) 
{ 
    node *temp = start->next; 

    if(start == NULL) 
     cout<<start->info<<"\n"; 
    else 
    { 
     read(temp); 
     cout<<start->info<<"\n"; 
    } 
} 

int main() 
{ 
    node *start = NULL; 

    for(int i=0;i<5;i++) 
    { 
     node *temp = new node; 
     temp->info=i; 
     temp->next=NULL; 

     if(start == NULL) 
      start = temp; 
     else 
     { 
      temp->next = start; 
      start = temp; 
     } 
    } 
    read(start);  
} 
+0

这功课吗? – Shaihi 2010-01-04 08:04:37

回答

4

这看起来是罪魁祸首:

if(start == NULL) 
    cout<<start->info<<"\n"; 

如果start为NULL,你不能取消对它的引用。

更仔细地观察,问题的根源在于:

node *temp = start->next; 

您检查是否开始为NULL之前这样做。

最后,我觉得奇怪的是,您正在使用名称'read'作为打印数据的函数。

1

在函数read中,当start == NULL时,不能像对待start-> info一样对其进行解引用。

1

线

if(start == NULL) 
     cout<<start->info<<"\n"; 

毫无意义可言。当开始时是NULL,你怎么能得到start->info?另外,简单地修复这一行不会修复你的代码,在其他地方也有相同的错误。

这看起来像家庭作业,所以我不张贴固定版本。

1

您在等到start为NULL,然后再执行第一个解除引用(将会转储核心)。你需要往前跑,直到继任者start为NULL:

将行:

if (start == NULL) 

有:

if (start->next == NULL) 

read(),你会得到:

0 
1 
2 
3 
4 

这是我认为你以后的事情。

但是你也想要防范一个空的列表,所以完整的实现应该是类似下面的东西。我不是一个污染命名空间的粉丝,所以我可能会删除using,并明确限定coutendl(我更喜欢"\n")。

另外,如果您想保存几行,则不需要temp。编译器不仅足够聪明,而且可以缓存诸如start->next之类的东西,而无需手动执行。

void read (node *start) { 
    if (start != 0) { 
     if (start->next == 0) { 
      std::cout << start->info << std::endl; 
     } else { 
      read (start->next); 
      std::cout << start->info << std::endl; 
     } 
    } 
}