-3

ツリーに対してさまざまな機能を実行するプログラムを作成しようとしていますが、これまでのところ、印刷機能を除いてすべて機能しています。以前は機能していましたが、他の機能のいくつかのねじれを(いじらずに)解決しようとしているときに、それらが修正されたので、これが突然機能しなくなり、その理由がわかりません。これが私のコードです:

main.cpp:

using namespace std;
#include <iostream>
#include <cstdlib>
#include <cstring>
#include "lcrs.h"

int main()
{
char *temp1;
char *temp2;
temp1 = new char;
temp2 = new char;

lcrs tree;

do{
    cout << "LCRS> ";
    cin >> temp1;
    if(strcmp(temp1, "quit") == 0)
    {
        return 0;
    }
    if(strcmp(temp1, "insert") == 0)
    {   cin >> temp2;
        bool error;
        for(int i=0; i<strlen(temp2); i++)
        {
            if(!isdigit(temp2[i]))
            {
                cout << "Error!" << endl;
                error = true;
            }
        }
        if(!error)
        {
            tree.insert(atoi(temp2), tree.root);
        }
    }
    else if(strcmp(temp1, "height") == 0)
    {
        if(tree.root == NULL)
            cout << "-1" << endl;
        else
            cout << tree.getHeight(tree.root) << endl;
    }
    else if(strcmp(temp1, "preorder") == 0)
    {
        cout << "Root is " << tree.root->data << endl;
        tree.print(tree.root);
        cout << "" << endl;
    }
    else if(strcmp(temp1, "search") == 0)
    {
        cin >> temp2;
                bool error;
                for(int i=0; i<strlen(temp2); i++)
             {
                       if(!isdigit(temp2[i]))
                       {
                                cout << "Error!" << endl;
                               error = true;
                     }
                }
               if(!error)
                   {
                         if(tree.search(atoi(temp2), tree.root))
                cout << "true" << endl;
            else
                cout << "false" << endl;
                }

    }
    else
    {
        cout << "Error! " << endl;
    }
}while(strcmp(temp1, "quit") !=0);

return 0;
}

lcrs.h:

using namespace std;
#include <cstdlib>
#include <iostream>

class node{
    public:
    int data;
    node *right;
    node *below;

    node()
    {
        right = NULL;
        below = NULL;
    }
};

class lcrs{
    public:
    node *root;
    bool search(int, node*);
    void print(node*);
    void insert(int, node*&);
    int getHeight(node*);

    lcrs()
    {
        root = NULL;
    }
};

lcrs.cpp:

using namespace std;
#include "lcrs.h"

bool lcrs::search(int x, node *b)
{
    if(b == NULL)
        return false;
    else
    {
        if(b->data == x)
            return true;
        else
        {
            return search(x, b->right) || search(x, b->below);
        }
    }
}

void lcrs::print(node *z)
{
    if(z->below == NULL || z->right != NULL)
    {
        cout << z->data << ",";
        print(z->right);
    }
    else if(z->below != NULL && z->right == NULL)
    {
        cout << z->data << ",";
        print(z->below);
    }
    else if(z->below != NULL && z->right != NULL)
    {
        cout << z->data << ",";
        print(z->below);
        print(z->right);
    }
    else if(z->right == NULL && z->below == NULL)
     {
             cout << z->data << "";
     }


}

void lcrs::insert(int x, node *&a)
{
    if(a == NULL)
    {
        node *newnode;
        newnode = new node;
        newnode->data = x;
        a = newnode;
    }
    else if(a->data < x)
    {
        if(a->right != NULL)
        {
            insert(x, a->right);
        }
        else if(a->below != NULL)
        {
            if(a->below->right != NULL)
            {
                insert(x, a->below->right);
            }
            else
            {
                insert(x, a->below);
            }
        }
        else
        {
            node *n;
            n = new node;
            n->data = x;
            a->below = n;
        }
    }
    else if(a->data > x)
    {
        if(a->below != NULL)
        {
            insert(x, a->below);
        }
        else
        {
            node *n;
            n = new node;
            n->data = x;
            a->right = n;
        }
    }
}
int lcrs::getHeight(node *h)
{
    int height = 0;
    node *n;
    n = new node;
    n = h;
    while(n->below != NULL || n->right != NULL)
    {
        if(n->below != NULL)
        {
            n = n->below;
            height ++;
        }
        else if(n->right != NULL)
        {
            n = n->right;
        }
    }
    return height;
}

tree.print(tree.root)関数呼び出しで、セグ フォールトが発生します。私は関数の最初にprintステートメントを入れましたが、決してそこに到達しないので、問題がどこにあるのか混乱しています。

よろしくお願いいたします。

4

2 に答える 2

0

多くの問題があります。入力の読み取り方法、単一の文字を保持するバッファへの文字列の詰め込み(代わりにstd :: stringを使用してください-理由があります)と関係がある場合もあれば、そのツリーという事実と関係がある場合もあります。ルートがnullである可能性があり、それを逆参照しています。cout << "Root is " << tree.root->data << endl;

また、コードを投稿するときは、実際に物事を削減するようにしてください。これは2つの目的を果たします:それはあなたを助けます(あなたは実際に自分で何が悪いのかを発見するかもしれないので、またはあなたが物事を切り詰めているので少なくとも障害を切り分けるかもしれないので)そしてそれは私たちがページを通過する必要がないので私たちを助けますとコードのページ。

于 2012-11-13T18:08:45.990 に答える
0

私は問題を発見しました。それは単なる小さなタイプミスでした。(もちろんそうでした。) 正当な回答をしてくれ、心から助けようとしたすべての人に感謝します。また、私にサッスをくれたすべての人に感謝します。デバッガーを使用した後、まだ頭がおかしいと思いますが、人々は私が低レベルの ComSci の学生であることを思い出させてくれます。どうもありがとうございました。

于 2012-11-13T18:23:45.973 に答える