简体   繁体   English

C 中 BST 程序的 function 之一的问题

[英]Problem in one of the function of the BST program in C

#include <stdlib.h>

struct btNode
{
    int data;
    struct btNode *right;
    struct btNode *left;
} * root, *temp1, *temp2;

void create(int);
void insert(int);
void postorder(struct btNode *);

int main()
{
    int choice, item;

    do
    {
        printf("\nChoose one of the options:\n");
        printf("1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit\n");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("\nEnter any number to insert:");
            scanf("%d", &item);
            insert(item);
            break;

        case 4:
            postorder(root);
            break;

        case 6:
            break;

        default:
            printf("\nWRONG INPUT");
        }
    } while (choice != 6);

    return 0;
}

void create(int num)
{
    temp1 = (struct btNode *)malloc(sizeof(struct btNode));
    temp1->data = num;
    temp1->left = NULL;
    temp1->right = NULL;
}

void insert(int num)
{
    create(num);
    if (root == NULL)
    {
        root = temp1;
        printf("%d inserted\n", root->data);
    }
    else
    {
        temp2 = root;
        while (temp2 != NULL)
        {
            //printf("inside while");
            if (temp2->data >= num)
            {
                temp2 = temp2->left;
                
            }

            else
            {
                temp2 = temp2->right;
      
            }
        }
        temp2 = temp1;
        printf("%d inserted\n", temp2->data);
    }
    
}

void postorder(struct btNode *r)
{
    if (root == NULL)
    {
        printf("Tree is empty");
        return;
    }

    else
    {
        postorder(r->left);
        postorder(r->right);
        printf("%d ", r->data);

    }
    
}

The above is an incomplete menu driven program for BST.以上是一个不完整的 BST 菜单驱动程序。 I've right now tried to do the function for creation of node, insertion and postorder.我现在尝试使用 function 来创建节点、插入和后序。 But the main problem occurs when I insert few elements and try to do the postorder the program abruptly kills itself.但是当我插入几个元素并尝试执行后序时,主要的问题就出现了,程序突然杀死了自己。 I have tried to debug the program, setting the breakpoint at all the three functions.我试图调试程序,在所有三个函数处设置断点。 And during debugging create() and insert() function works well but the main problem occurs during postorder() function.在调试create()insert() function 期间运行良好,但主要问题发生在 postorder postorder() function 期间。 Please help me solve the problem.请帮我解决问题。

Please see my comments marked with // CHANGE HERE .请参阅我标记为// CHANGE HERE的评论。

Test link: https://onlinegdb.com/FK7SQ02nP测试链接: https://onlinegdb.com/FK7SQ02nP

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

struct btNode
{
    int data;
    struct btNode *right;
    struct btNode *left;
};    // CHANGE HERE: remove globals

struct btNode* create(int);    // CHANGE HERE: signature change
struct btNode* insert(struct btNode*, int); // CHANGE HERE: signature change
void postorder(struct btNode *);

int main()
{
    int choice, item;
    // CHANGE HERE: assign root to NULL
    struct btNode* root = NULL;
    do
    {
        printf("\nChoose one of the options:\n");
        printf("1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit\n");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("\nEnter any number to insert:");
            scanf("%d", &item);
            root = insert(root, item);
            break;

        case 4:
            postorder(root);
            break;

        case 6:
            break;

        default:
            printf("\nWRONG INPUT");
        }
    } while (choice != 6);

    return 0;
}

// CHANGE HERE: return the pointer from function
struct btNode* create(int num)
{
    struct btNode* temp1 = (struct btNode *)malloc(sizeof(struct btNode));
    temp1->data = num;
    temp1->left = NULL;
    temp1->right = NULL;
    return temp1;
}
// CHANGE HERE: accept root node as argument and return the root node from function
struct btNode* insert(struct btNode* root, int num)
{
    // CHANGE HERE: store returned pointer
    struct btNode* temp1 = create(num);
    if (root == NULL)
    {
        root = temp1;
        printf("%d inserted\n", root->data);
    }
    else
    {
        // CHANGE HERE: see the while loop
        struct btNode* temp2 = root;
        while (temp2 != NULL)
        {
            //printf("inside while");
            if (temp2->data >= num)
            {
                // CHANGE HERE
                if (temp2->left)
                    temp2 = temp2->left;
                else
                {
                    temp2->left = temp1;
                    printf("%d inserted\n", temp2->left->data);
                    break;
                }
            }

            else
            {
                // CHANGE HERE
                if (temp2->right)
                    temp2 = temp2->right;
                else
                {
                    temp2->right = temp1;
                    printf("%d inserted\n", temp2->right->data);
                    break;
                }
            }
        }
        // CHANGE HERE: commented these two lines
        // temp2 = temp1;
        // printf("%d inserted\n", temp2->data);
    }
    return root;
}

void postorder(struct btNode *r)
{
    // CHANGE HERE: replaced root with r
    if (r == NULL)
    {
        //printf("Tree is empty");
        return;
    }

    else
    {
        postorder(r->left);
        postorder(r->right);
        printf("%d ", r->data);

    }
}

Sample Output:样品 Output:

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:2
2 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:34
34 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:564
564 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:342
342 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-1000
-1000 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-332
-332 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-987
-987 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-9
-9 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
4
-987 -9 -332 -1000 342 564 34 2 
Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM