2013-02-27 121 views
1

我会尽量简短。当我运行代码时,我输入第一个字符(例如:'k'),一切都很好。第二次,我输入一个字符(例如:'j'),我得到一个错误,编译器说它在线上(有注释)。请帮忙。谢谢。用C创建树新的结构++

代码:

struct nodeType{ 
    char letter; 
    nodeType*leftNode; 
    nodeType*rightNode; 

}; 
void putInNode(nodeType*n,char c){ 
    if ((char)(n->letter) >='a' && (char)(n->letter) <='z')/* ERROR IS HERE*/ 
    { 
     if(n->letter < c) 
      putInNode(n->leftNode, c); 
     else 
      putInNode(n->rightNode, c); 
    } 
    n->letter=c; 
} 
int main(){ 
    nodeType*a=new nodeType(); 
    char c; 
    do { 
     cin >> c; 
     if(c=='.') 
      break; 
     putInNode(a,c); 
    } while (true); 
    cout << a->letter << endl; 

} 
+0

而_what_错误,你得到什么?请包含_complete_和_unedited_错误消息。 – 2013-02-27 18:56:38

+0

顺便说一句,你真的应该创建一个构造函数,使指针无效,也** **检查为空,否则你会在内存步骤周围,直到你的程序崩溃。 – 2013-02-27 18:58:10

回答

3

如果这样做的目的是为了从输入流只建信的树,停止当你到达一个周期,并跳过任何不{'a'...'z'},我认为这是你以后:

#include <iostream> 

struct nodeType 
{ 
    nodeType(char ch = 0) 
     : letter(ch), leftNode(), rightNode() 
    {} 

    char letter; 
    nodeType* leftNode; 
    nodeType* rightNode; 
}; 

void putInNode(nodeType*& n,char c) 
{ 
    if (!n) 
    { 
     n = new nodeType(c); 
    } 
    else if (n->letter >='a' && n->letter <='z') 
    { 
     if(c < n->letter) 
      putInNode(n->leftNode, c); 
     else 
      putInNode(n->rightNode, c); 
    } 
} 

int main() 
{ 
    nodeType* a = NULL; 
    char c; 
    while ((std::cin >> c) && c != '.') 
     putInNode(a,c); 

    if (a) 
     std::cout << a->letter << '\n'; 
} 

注意:这会将副本向下推入右侧子行。如果这不是本意,进行以下更改:

 if(c < n->letter)) 
      putInNode(n->leftNode, c); 

此相反:

 if(c <= n->letter)) // <== note less-or-equal 
      putInNode(n->leftNode, c); 

我离开所产生的动态树的清理给你。它应该指出的是,作为写入(双方事先和现在)的第一个节点将永远是你的树的根(我假设有一天你打算通过转移分担功能,比如你进一步移动沿着这条道路)。

2

相当肯定,问题是,你实际上没有分配任何节点从根节点APPART。因此,当你进入第二个字母,第一个字母已经设定在父节点的信,当它试图取消引用树中的左节点,它失败(B/C这是未分配的内存)。

+0

+1。 Nail => Head – StoryTeller 2013-02-27 19:06:27

1

问题是你只为单个节点分配空间,而不是你的初始化变量。通过do

我第一次承担a->letter = 0进入putInNode功能字母将被分配到k所以当。通过循环n->letter下次还会k这是azk < j之间将真正使putInNode(n->leftNode, c);

n->leftNode尚未初始化,但这样当您尝试尊重它像n->letter你会得到一个段错误。

为了解决这个问题(假设你不想要这个功能,使新的节点)是为你的结构创建一个构造函数,然后检查空。

struct nodeType{ 
    nodeType() 
    { 
    letter = 0; 
    leftNode = nullptr; 
    rightNode = nullptr; 
    } 
    char letter; 
    nodeType*leftNode; 
    nodeType*rightNode; 
}; 

然后在putInNode

void putInNode(nodeType*n,char c){ 
    if(n == nullptr) { 
     return; 
    } 
    if ((char)(n->letter) >='a' && (char)(n->letter) <='z') { 
    . 
    . 
    . 
+0

非常感谢你们。我是这个领域的新手,这就是为什么它可能看起来像一个愚蠢的问题。但我很感激。问题解决了。 – alhadhrami 2013-02-27 19:32:38