为什么输出变成无穷大

时间:2019-10-24 11:33:50

标签: c data-structures struct binary-search-tree preorder

这是我用来在BST中添加的代码,这是preorder函数,为什么会变成无穷大?我从用户那里输入要添加的元素,但是输出却变成了无穷大

    void add(){
      struct node* temp=(struct node *) malloc(sizeof(struct node));
      struct node* current=root;
      printf("\nEnter the data:\n");
      scanf("%d",&temp->data);
      while(current->left!=NULL && current->right!=NULL){
            parent=current;
        if(temp->data > parent->data){
            current=current->right;
        }
        else{
            current=current->left;
        }

      }
      if(temp->data > parent->data){
            parent->right=temp;
            parent->left=NULL;
        }
        else{
            parent->left=temp;
            parent->right=temp;
        }
    }

    void preorder(struct node* node)
    {
         if (node == NULL)
              return;

         /* first print data of node */
         printf("%d ", node->data);

         /* then recur on left subtree */
         preorder(node->left);

         /* now recur on right subtree */
         preorder(node->right);
    }

2 个答案:

答案 0 :(得分:1)

函数add具有未定义的行为。

对于初学者,root最初可以等于NULL。所以您可能不使用这种方法

  struct node* current=root;
  //...
  while(current->left!=NULL && current->right!=NULL){

因为尝试使用空指针访问内存。

第二个循环

  while(current->left!=NULL && current->right!=NULL){
        parent=current;

不处理仅包含一个不等于NULL的子节点的节点。

您还没有在创建的节点温度的左侧和右侧将数据成员设置为NULL。

这些陈述中有错字

        parent->left=temp;
        parent->right=temp;

因此函数定义无效。

该函数应该只做一件事:将一个节点附加到树上。它不应提示用户输入一些数据。

请注意,对于根节点使用全局变量是个坏主意。

尽管如此,这里还是一个使用您的方法的演示程序。我称这种方法为Java方法(在C中,函数add可以编写得更加简单)

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

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

struct node *root;

_Bool add( int data )
{
    struct node *new_node = malloc( sizeof( struct node ) );
    _Bool success = new_node != NULL;

    if ( success )
    {
        new_node->data  = data;
        new_node->left  = NULL;
        new_node->right = NULL;

        if ( root == NULL )
        {
            root = new_node;
        }
        else
        {
            for ( struct node *current = root; ; )
            {
                struct node *parent = current;

                if ( data < current->data )
                {
                    current = current->left;
                    if ( current == NULL )
                    {
                        parent->left = new_node;
                        break;
                    }
                }
                else
                {
                    current = current->right;
                    if ( current == NULL )
                    {
                        parent->right = new_node;
                        break;
                    }
                }
            }
        }
    }

    return success;
}

void preorder( const struct node *node )
{
    if ( node != NULL )
    {
        printf( "%d ", node->data );
        preorder( node->left );
        preorder( node->right );
    }
}

int main(void) 
{
    srand( ( unsigned int )time( NULL ) );

    const int N = 10;

    for ( int i = 0; i < N; i++ ) add( rand() % N );

    preorder( root );

    putchar( '\n' );

    return 0;
}

程序输出看起来像

4 0 3 2 1 0 1 2 5 8 

下面有一个演示程序,该程序演示如何使用C方法编写函数add。在程序中,全局变量root被删除并替换为局部变量root。

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

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

_Bool add( struct node **root, int data )
{
    struct node *new_node = malloc( sizeof( struct node ) );
    _Bool success = new_node != NULL;

    if ( success )
    {
        new_node->data  = data;
        new_node->left  = NULL;
        new_node->right = NULL;

        while ( *root != NULL )
        {
            if ( data < ( *root )->data ) root = &( *root )->left;
            else root = &( *root )->right;
        }

        *root = new_node;
    }

    return success;
}

void preorder( const struct node *node )
{
    if ( node != NULL )
    {
        printf( "%d ", node->data );
        preorder( node->left );
        preorder( node->right );
    }
}

int main(void) 
{
    struct node *root = NULL;

    srand( ( unsigned int )time( NULL ) );

    const int N = 10;

    for ( int i = 0; i < N; i++ ) add( &root, rand() % N );

    preorder( root );

    putchar( '\n' );

    return 0;
}

现在研究并比较函数add的两种实现。

答案 1 :(得分:-1)

您必须以这种方式重写add方法,

void add()
    {
        int data;
        printf("\nEnter the data:\n");
        scanf("%d",data);
        root = insert_rec(root, data);
    }
struct node* insert_rec(struct node* current, int data)
    {


        if(current == NULL)
        {
            struct node* temp=(struct node *) malloc(sizeof(struct node));
            temp->data = data;
            current = temp;
            return current;
        }
        else
        {
            if(current->data > data)
            {
                current->left = insert_rec(current->left, data);
            }
            else
            {
                current->right = insert_rec(current->right, data);
            }
        }
        return current;
    }

这是BST插入的递归方法。 希望这会有所帮助:)