0

重複の可能性:
バイナリ ツリー - ポインターの逆参照

ユーザーがノードを挿入し、ツリー内のすべてのノードを順番、前順、または後順モードで表示できる単純な二分探索ツリー プログラムを作成しようとしていました。私のコードは


#include <stdio.h>
#include <stdlib.h>

struct treenode
{
int data;
struct treenode *lchild;
struct treenode *rchild;
};

void insertnode(struct treenode **n,int d)
{
struct treenode *p=&n;
if(p==NULL)
{
    // means the tree is empty
    p=(struct treenode *)malloc(sizeof(struct treenode));
    p->data=d;
    p->lchild=NULL;
    p->rchild=NULL;
}

else
{
    // strat comparing the new data from root
    if( d<p->data )
        insertnode(((p->lchild)),d);

    else
        insertnode(((p->rchild)),d);
}
}

void preorder(struct treenode **n)
{
struct treenode *p=&n;
if(p==NULL)
{
    printf("\nThe list is empty");
}

else
{
    printf("%d",p->data);
    preorder(p->lchild);
    preorder(p->rchild);
}

}

void postorder(struct treenode **n)
 {
struct treenode *p=&n;
if(p==NULL)
{
    printf("\nThe list is empty");
}

else
{
    preorder(p->lchild);
    preorder(p->rchild);
    printf("%d",p->data);
}

}

void inorder(struct treenode **n)
{
struct treenode *p=&n;
if(p==NULL)
{
    printf("\nThe list is empty");
}

else
{
    preorder(p->lchild);
    printf("%d",p->data);
    preorder(p->rchild);
}

}

int main(void)
{
struct treenode *root=NULL;
int choice,data;

while(1)
{
    printf("\nPress 1 for inserting a node in BST fashion: ");
    printf("\nPress 2 for traversing the tree in preorder fashion :");
    printf("\nPress 3 for traversing the tree in postorder fashion :");
    printf("\nPress 4 for traversing the tree in inorder fashion :");
    printf("\nPress 5 to exit :");


    printf("\nEnter your choice: ");
    scanf("%d", &choice);

    switch(choice)
    {
        case 1: printf("\nEnter the data to be inserted:");
            scanf("%d",&data);
            insertnode(&root,data);
            break;

        case 2: preorder(&root);
            break;

        case 3: postorder(&root);
            break;

        case 4: inorder(&root);
            break;

        case 5: exit(0);
            break;

        default: printf("\nYou have enetred an invalid choice. Please try again");
    }
}

return 0;
}

プログラムは正常に実行されますが、ノードに入った後、エクスプローラーがエラーを検出し、プログラムが動作を停止します。コードにバグはありますか?

4

1 に答える 1

2

ネタバレ:

#include <stdio.h>
#include <stdlib.h>

struct treenode {
    struct treenode *lchild;
    struct treenode *rchild;
    int data;
    } *root = NULL;

void insertnode(struct treenode **pp,int d)
{
    for( ;*pp; )
    {
         if (d < (*pp)->data) pp = &(*pp)->lchild;
         else  pp = &(*pp)->rchild;
    }
    *pp = malloc (sizeof **pp);
    (*pp)->data = d;
    (*pp)->lchild = NULL;
    (*pp)->rchild = NULL;
}

void preorder(struct treenode *p)
{
    if(p==NULL)
    {
        printf("\nThe list is empty");
        return;
    }

    printf("%d,",p->data);
    if (p->lchild) preorder(p->lchild);
    if (p->rchild) preorder(p->rchild);
}

void postorder(struct treenode *p)
{
    if(p==NULL)
    {
        printf("\nThe list is empty");
        return;
    }

    if (p->lchild) preorder(p->lchild);
    if (p->rchild) preorder(p->rchild);
    printf("%d,",p->data);
}
void inorder(struct treenode *p)
{
    if(p==NULL)
    {
        printf("\nThe list is empty");
        return;
    }

    if (p->lchild) preorder(p->lchild);
    printf("%d,",p->data);
    if (p->rchild) preorder(p->rchild);
}

int main(void)
{
    root=NULL;
    int choice,data;

    while(1)
    {
         printf("\nPress 1 for inserting a node in BST fashion: ");
         printf("\nPress 2 for traversing the tree in preorder fashion :");
         printf("\nPress 3 for traversing the tree in postorder fashion :");
         printf("\nPress 4 for traversing the tree in inorder fashion :");
         printf("\nPress 5 to exit :");


         printf("\nEnter your choice: ");
         scanf("%d", &choice);

    switch(choice)
    {
        case 1: printf("\nEnter the data to be inserted:");
            scanf("%d",&data);
            insertnode( &root,data);
            break;

        case 2: preorder(root);
            break;

        case 3: postorder(root);
            break;

        case 4: inorder(root);
            break;

        case 5: exit(0);
            break;
        default: printf("\nYou have entered an invalid choice. Please try again");
    }
}

return 0;
}
于 2012-07-16T09:30:17.463 に答える