1

我会保持简短。当我运行代码时,我输入第一个字符(例如:'k'),一切都很好。第二次我输入一个字符(例如:'j')我得到一个错误,编译器说它在线(有注释)。请帮忙。谢谢你。

代码:

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;

}
4

3 回答 3

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);

我将生成的动态树的清理工作留给您。并且应该注意的是,写的(以前和现在)第一个节点将永远是你的树的根(我假设有一天你计划通过轮班来平衡,比如你在这条路上走得更远)。

于 2013-02-27T19:09:51.243 回答
2

很确定问题在于您实际上并没有从根节点分配任何节点。因此,当您输入第二个字母时,第一个字母已经在父节点中设置了该字母,并且当它试图取消引用树中的左节点时,它会失败(b/c 那是未分配的内存)。

于 2013-02-27T19:01:09.340 回答
1

问题是您只是为单个节点分配空间而不是初始化变量。

我假设第一次通过do循环,a->letter = 0所以当输入putInNode函数时,字母将被分配给k. 下一次通过循环n->letter将是介于两者k之间a并且将是真的所以zk < jputInNode(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') {
   .
   .
   .
于 2013-02-27T19:10:06.440 回答