0

以下のコードでは、insert 関数を使用してバイナリ ツリーを作成し、in-order トラバーサルのロジックに従う inorder 関数を使用して挿入された要素を表示しようとしています。実行すると、数値が挿入されますが、inorder を試すとfunction( input 3) の場合、プログラムは何も表示せずに次の入力を続行します。論理エラーが発生している可能性があります。クリアするのを手伝ってください。前もって感謝します...

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

int i;
typedef struct ll
{
  int data;
  struct ll *left;
  struct ll *right;
} node;

node *root1=NULL; // the root node

void insert(node *root,int n)
{
  if(root==NULL) //for the first(root) node
  {
    root=(node *)malloc(sizeof(node));
    root->data=n;
    root->right=NULL;
    root->left=NULL;
  }
  else
  {
    if(n<(root->data))
    {
      root->left=(node *)malloc(sizeof(node));
      insert(root->left,n);
    }
    else if(n>(root->data))
    {
      root->right=(node *)malloc(sizeof(node));
      insert(root->right,n);
    }
    else
    {
      root->data=n;
    }
  }
}

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

main()
{
  int n,choice=1;
  while(choice!=0)
  {
    printf("Enter choice--- 1 for insert, 3 for inorder and 0 for exit\n");
    scanf("%d",&choice);
    switch(choice)
    {
      case 1:
        printf("Enter number to be inserted\n");
        scanf("%d",&n);
        insert(root1,n);
        break;
      case 3:
        inorder(root1);
        break;
      default:
        break;
    }
  }
}
4

3 に答える 3

1

関数のスコープに対してローカルな へのポインタinsertを受け入れます。node返された後insert、呼び出されたルートは変更されません。そして、あなたは漏れます。

変更を外部に表示したい場合はinsert、署名を変更することから始めます

void insert(node **root,int n)

そしてそれを次のように呼び出します:

void insert(&root1, n);

そうすればroot1、コピーではなく変更されます。

経験則として、関数が何かを変更する必要がある場合は、その関数へのポインターを渡す必要があります。関数は a を変更する必要があるため、 anode*を渡す必要がありnode**ます。

編集

アンワインドが指摘したように、ルートを更新する手段としてルートを返すこともできます

root1 = insert(root1, n);

もちろん、これは 1 つのオブジェクトを変更する必要がある場合にのみ機能します。

于 2013-10-31T09:45:41.850 に答える