Как я могу прочитать данные от пользователя и использовать их в той же функции, в которой я вставляю узлы в BST - PullRequest
1 голос
/ 26 мая 2020

У меня есть оценка C курса программирования. Они попросили создать функцию для вставки новых узлов для BST. В той же функции мне нужно заполнить N данных от пользователя (ID и Salary). и в основном я прошу пользователя ввести, сколько данных он / она хочет ввести, и вызвать функцию вставки.

Я сделал следующее, и это на 100% неверно:)

#include <stdio.h>
    #include <stdlib.h>
    struct Node {
        int EmployeeID;
        float Salary;
        struct Node* left;
        struct Node* Right;
    };
    struct Node* insert(struct Node* root, int N) {
        int Key;
        float Salary;
        int i;
        for (i = 0; i < N; i++) {
            printF("Enter Employee ID: ");
            scanf_s("%d", &Key);
            printF("Enter Employee Salary: ");
            scanf_s("%f", &Salary);
            if (root = NULL) {
                root = (struct Node*)malloc(sizeof(struct Node));
                root->EmployeeID = Key;
                root->Salary = Salary;
                root->left = root->Right = NULL;
            }
            else if (Key < root->EmployeeID)
                root->left = insert(root->left, Key);
            else
                root->Right = insert(root->Right, Key);
        }
    }
    void PrePrint(struct Node* root) {
        if (root == NULL)
            return;

        printf("%d   %.2f \n", root->EmployeeID, root->Salary);
        PrePrint(root->left);
        PrePrint(root->Right);
        return;
    }

    int main()
    {
        int x;
        struct Node* root = NULL;
        struct Node*temp = (struct Node*)malloc(sizeof(struct Node));
        temp = root;
        printf("How many Employee would you like to enter? ");
        scanf_s("%d", &x);
        root= insert(root, x);
        PrePrint(root);
        return 0;
    }

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

По запросу меня попросили ввести данные в самой функции вставки. Итак, здесь -

void insert(binary_search_tree *t, int N) {//N is number of nodes to be added
      for(int i=0;i<N;i++){
          int EmployeeID; 
          scanf("%d",&EmployeeID);
          float salary;
          scanf("%d",&salary); 

          node* n = new_node(EmployeeID,salary); 
          node *y = NULL;
          node *temp = t->root;
          while(temp != NULL) {
            y = temp;
            if(n->data < temp->data)
              temp = temp->left;
            else
              temp = temp->right;
          }
          n->parent = y;

          if(y == NULL) //newly added node is root
            t->root = n;
          else if(n->data < y->data)
            y->left = n;
          else
            y->right = n;
      }
    }

Вот структура binary_serach_tree, которую я использовал для хранения узла root -

typedef struct binary_search_tree {
  node *root;
}binary_search_tree;

Структура узла такая же, как у вас. Но не забудьте использовать ключевое слово struct Node* вместо просто Node *, как я использовал в своем коде, если вы не используете typedef в определении вашего struct Node.

0 голосов
/ 26 мая 2020

Вы должны l oop и вставлять любой новый узел как оставить в BST. Стандартная функция вставки в BST будет следующей:

предположим, что вы объявляете свое дерево root как binary_search_tree *t = new_binary_search_tree();

, вы можете прочитать свой ввод как -

int EmployeeID; 
scanf("%d",&EmployeeID);
float salary;
scanf("%d",&salary);

Затем вы можете создать новый узел -

node* n = new_node(EmployeeID,salary); 

и передать его в функцию вставки ниже.

    void insert(binary_search_tree *t, node *n) {
      node *y = NULL;
      node *temp = t->root;
      while(temp != NULL) {
        y = temp;
        if(n->data < temp->data)
          temp = temp->left;
        else
          temp = temp->right;
      }
      n->parent = y;

      if(y == NULL) //newly added node is root
        t->root = n;
      else if(n->data < y->data)
        y->left = n;
      else
        y->right = n;
    }

Функция new_node будет иметь вид -

node* new_node(int emp_id,float sal) {
  node *n = malloc(sizeof(node));
  n->EmployeeID= emp_id;
  n->salary= sal;
  n->left = NULL;
  n->right = NULL;
  n->parent = NULL;

  return n;
}

Это вставит новый узел как листовой узел в ваш BST. Вы можете использовать этот фрагмент в качестве справки и соответствующим образом изменить.

...