Я пытался реализовать двоичное дерево в C, но я застрял с указателями, и это действительно очень грязно - PullRequest
0 голосов
/ 04 мая 2020
  1. Секция заголовка

    #include <stdio.h>
    #include <stdlib.h>
    
  2. Структура

    typedef struct bst
     {
    int data;
    struct bst *left;
    struct bst *right;
    } node;
    

    2.1 Функции

    node *create();
    void insert(node *, node *, node *,node *);
    void preorder(node *);
    
  3. Основной раздел

    В этом разделе я попытался создать узел root и 2 дочерних узла, если узел root не равен нулю. Мне пришлось создать 2 дочерних для каждого родительского узла одновременно.

     void main()
     {
    char ch;
    node *root = NULL, *temp, *p, *temp1;
    do
    {
        temp = create();
        if (root == NULL)
        {
            root = temp;
        }
        else
        {
            temp1 = create();        /*Creation of the second child*/
            p = root;
            insert(root, temp, temp1,p);
        }
            printf("nDo you want to enter more(y/n)? ");
            getchar();
            scanf("%c", &ch);
    } while (ch == 'y' | ch == 'Y');
    
    printf("\nPreorder Traversal: ");
    preorder(root);
    
    }
    
  4. Создать функцию

    Ничего нового здесь не создано, создал переменную локального узла "Temp1" и передали ее вызывающей функции.

    node *create()
    {
    node *temp1;
    printf("\nEnter data. Type -1 if you don't want to send to someone");
    
    temp1 = (node *)malloc(sizeof(node));
    scanf("%d", &temp1->data);
    if(temp1->data==-1)
    {
        return NULL;
    }
    temp1->left = temp1->right = NULL;
    return temp1;
    }
    
  5. Секция вставки

    Вот где она действительно получается грязный, потому что я пытался использовать рекурсивные вызовы, чтобы перейти через занятые или (узлы, левый и правый дочерние элементы которых уже есть), чтобы найти пустой узел с левым и правым = NULL.>

    void insert(void insert(node *root, node *temp, node *temp1, node *p)
      {
    
      if (root->left == NULL && root->right == NULL)
      {
         root->left = temp;
        root->right = temp1;
      }
     if (root->left != NULL && root->right != NULL) /*In case the node has left and right children*/
        {
          insert(root->left, temp, temp1,p);    /*Finding an empty block through left sub tree*/                         
          root=p
          insert(root->right, temp, temp1,p);
        }
    
      }
    

    В этот момент программа вошла в бесконечность l oop. Все, что я хотел сделать, - это создавать по 2 узла на каждый родительский узел одновременно, чтобы информация могла доходить до клиентов под одним и тем же провайдером в в то же время.

  6. Обход

      void preorder(node * root)
        {
        if (root != NULL)
        {
            printf("%d ", root->data);
            preorder(root->left);
            preorder(root->right);
        }
        }
    
  7. Выход

    Ввод данных. Введите -1, если вы не хотите отправлять кому-либо: 100
    nВвести больше (да / нет)? y

    Введите данные. Введите -1, если вы не хотите отправлять кому-либо: 200

  8. Отладчик

    0x00000000004007e1 во вставке (root = 0x602030, temp = 0x602030, temp1 = 0x602050,
    p = 0x602010) в основном. c: 64
    64 вставка (root -> left, temp, temp1, p);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...