3

みなさん、こんにちは私は論理的な間違いを犯しますが、間違いは見つかりません。

ありがとうございました :))

私のアルゴリズム

#include <iostream>   //iostream

using namespace std;

struct node{

    struct node *left;
    struct node *right;
    int data;
};


void add(node *p,int sayi){

    if(p==NULL){
        p=new node();
        p->data=sayi;
        p->left=NULL;
        p->right=NULL;

    }
    else if(p->data>=sayi){
            add(p->left,sayi);  
    }
    else    {
            add(p->right,sayi);
    }

}

void postorder(node *p)
{

if(p!=NULL)

    {
        if(p->left!=NULL)
            postorder(p->left);
        if(p->right!=NULL)
            postorder(p->right);
        cout<< p->data<<endl;
    }
    else{
        cout<<"hata"<<endl;

    }
}

  void main(){

    struct node *k=NULL ;
    int sayi=0;

    while(sayi!=-1){
    cout<<"Bir sayi giriniz...";
    cin>>sayi;
    add(k,sayi);
    }
    postorder(k);

    system("pause");
}
4

3 に答える 3

3

あなたは価値を渡しstruct node *kます。関数内で(のようにadd)変更するたびに、ローカルコピー(関数内)のみが変更されるため、NULLポインターが返されます。参照またはポインタで渡します。

void add(node* &p,int sayi)
{
     ...
}

struct node *k = 0;
...
add(k);

また

void add(node** p,int sayi)
{
     ... 
}

struct node *k = 0;
...
add(&k);
于 2012-12-23T15:35:16.653 に答える
2

追跡するには、データ構造へのルートノードが必要です。postorder()また、このルートノード参照をadd()関数呼び出しに渡す必要があります。これがルートkノードのようです。k関数内でアクセスできるように、外部で宣言しますadd()

#include <iostream>   //iostream

using namespace std;

struct node{

    struct node *left;
    struct node *right;
    int data;
};

struct node *k=NULL; //ROOT NODE


void add(node *p,int sayi){

    if(p==NULL){
        p=new node();
        p->data=sayi;
        p->left=NULL;
        p->right=NULL;
        if(k==NULL)
        k=p;  //When the first node is created, we assign it to root, i.e, k    
    }
    else if(p->data>=sayi){
            add(p->left,sayi);  
    }
    else    {
            add(p->right,sayi);
    }

}

void postorder(node *p)
{

if(p!=NULL)

    {
        if(p->left!=NULL)
            postorder(p->left);
        if(p->right!=NULL)
            postorder(p->right);
        cout<< p->data<<endl;
    }
    else{
        cout<<"hata"<<endl;

    }
}

  void main(){

    int sayi=0;

    while(sayi!=-1){
    cout<<"Bir sayi giriniz...";
    cin>>sayi;
    add(k,sayi);
    }
    postorder(k);

    system("pause");
}
于 2012-12-23T15:37:49.610 に答える
2

コードを次のように変更してみてください。

#include <iostream>   //iostream

using namespace std;

struct node{

    struct node *left;
    struct node *right;
    int data;
};


node* add(node *p,int sayi){

    if(p==NULL){
        p=new node();
        p->data=sayi;
        p->left=NULL;
        p->right=NULL;
        return p;
    }
    else if(p->data>=sayi){
            p->left=add(p->left,sayi);  
    }
    else    {
            p->left=add(p->right,sayi);
    }
    return p;
}

void postorder(node *p)
{

if(p!=NULL)

    {
        if(p->left!=NULL)
            postorder(p->left);
        if(p->right!=NULL)
            postorder(p->right);
        cout<< p->data<<endl;
    }
    else{
        cout<<"hata"<<endl;

    }
}

int main(){

    struct node *k=NULL ;
    int sayi=0;

    while(sayi!=-1){
    cout<<"Bir sayi giriniz...";
    cin>>sayi;
    k=add(k,sayi);
    }
    postorder(k);
}
于 2012-12-23T15:51:59.307 に答える