Как я могу создать BST, читая из текстового файла? - PullRequest
0 голосов
/ 26 мая 2019

Мне нужно создать базу данных студентов, которая будет содержать их ID, имя, фамилию и оценку.Эта информация читается из текстового файла, который выглядит следующим образом:

AE797989 Spears Michael 10.00
AA566734 Walsh Brad 10.00
AE808090 Jones Dimitris 5.00
...

и содержит 19 студентов

Я должен прочитать каждую строку файла и создать двоичное дерево поиска на основе ихЯ БЫ.Кажется, есть проблема при создании узла, потому что, когда я пытаюсь найти студента, я не могу.Вот мой код:

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

struct node
{
    struct node *left;
    char ID[100];
    char NAME[100];
    char LAST_NAME[100];
    float Grade;
    struct node *right;
};

struct node *newNode(char, char, char, float);
struct node *insertNode(struct node node, char id, char name, char last_name, float grade);
void search(struct node *root, char *ID);
void deleteFromBST(char *ID);

int main() 
{

  char ID[100];
  int insertDone = 0;
  int ch;

  while (1) {
    printf("\n1. Insertion\t2. Deletion\n");
    printf("3. Searching\t4. Display In Order\n5. Edit\t        6. Exit\n");
    printf("Enter your choice:");
    scanf("%d", &ch);


    switch (ch) {
    case 1: 
      if (insertDone)
        puts("Inserton was already done");
      else {
        struct node* insertNode(struct node *node,char *id, char *name, char *last_name, float grade)
        {
            if (node == NULL)
            return newNode(*id,*name,*last_name,grade);

            if ( strcmp(id , node->ID) < 0)
            node->left = insertNode(node->left,id,name,last_name,grade);

            else if ( strcmp( id , node->ID) >= 0)
            node->right = insertNode(node->right,id,name,last_name,grade);

            return node;
        }   
        insertDone = 1;
      }
      break;

    case 2:     
      break;

    case 3: 
      printf("Enter the AM to search:");
      scanf("%99s", ID);
      void search(struct node *root, char *ID)
        {
        int flag=0;

        if (!root) 
        {
        printf("Search element unavailable in BST\n");
        return;
        }

        while (root != NULL) {
        if (strcmp(root->ID, ID) == 0) {
            printf("Student ID  : %s\n", root->ID);
            printf("First Name     : %s\n", root->NAME);
            printf("Last Name     : %s\n", root->LAST_NAME);
            printf("grade      : %lg\n", root->Grade);
            flag = 1;
            break;
             }

        else if (strcmp(ID , root->ID) > 0)
        { 
         return search(root->right,ID); 
        }

        else if(strcmp(ID , root->ID) < 0)
        {
        return search(root->left,ID);
        }

          if (!flag)
          printf("Search element unavailable in BST\n");
        }
       }

      break;
    case 4: 
      //display();
      break;
    case 5:
      break;
    case 6: 
      exit(0);
    default: 
      printf("U have entered wrong option!!\n");
      break;
    }
  }
  struct node* newNode(char *id, char *name, char *last_name, float grade)
{

  struct node *newnode = malloc(sizeof(struct node));
  struct node Node;

  FILE *fp;
  fp = fopen ("Foitites-Vathmologio-DS.txt","rb");

  if (fp == NULL) 
  { 
    fprintf(stderr,"Could not open file");  
    return;
  } 

  char line[4096];

  while (fgets(line, sizeof line,fp)) 
  {
    size_t len = strlen(line);
    if (len && (line[len - 1] == '\n')) 
    {
      /* incomplete line */
      if (sscanf(line,"%99s %99s %99s %f",Node.ID, Node.NAME, Node.LAST_NAME, &Node.Grade) != 4) 
      {
      puts("invalid file");
      return;
      }

    strcpy(newnode->ID , id);
    strcpy(newnode->NAME , name);
    strcpy(newnode->LAST_NAME , last_name);
    newnode->Grade = grade;
    newnode->left = newnode->right = NULL;
    return newnode;

    }
  }
fclose(fp);
}
  return 0;
}

Я не получаю сообщений об ошибках .. спасибо за ваше время!

1 Ответ

1 голос
/ 26 мая 2019

Если вы не получили сообщение об ошибке с этим кодом, я бы посоветовал вам использовать другой компилятор. Мои дроссели в main при:

    switch (ch) {
    case 1:
        if (insertDone)
            puts("Inserton was already done");
        else {
            struct node* insertNode(struct node *node, char *id, char *name,
                   char *last_name, float grade)      // ERROR HERE
            {
                if (node == NULL)

Похоже, что вы скопировали определение функции вместо того, чтобы просто вызывать ее.

Моя проблема в том, что вам удалось написать много разных ошибок в одной программе. И глобальный дизайн того, как должна быть структурирована программа, не ясен: похоже, что вы начали кодировать, не написав сначала на бумаге (да, бумаги и карандаши по-прежнему очень хорошие инструменты для начинающих), что должна делать каждая функция делать, каковы были его входные данные и какие должны быть его выходные данные и, в конечном итоге, какие данные он включал (например, какая часть отвечает за имя файла). Конечно, я мог бы написать для вас программу BST, но вы бы ничему этому не научились.

Итак, вот несколько советов:

  • в BST вы вставляете новые данные в существующие узлы, поэтому вам понадобится функция insertNode со следующими входными параметрами: текущий корневой узел (или NULL в первый раз), идентификатор, имя, фамилия и ранг для вставки , Вы должны создать новую копию входных строк (strdup ваш друг). Эта функция выделяет новую структуру, заполняет поля и возвращает ее, если текущий корень равен NULL, или вставляет ее в правильное место в существующем дереве
  • вы хотите обработать все строки из файла. Вам понадобится функция, которая открывает файл, читает его построчно и будет использовать предыдущую для вставки новой записи в BST

Кстати, функция определение - это что-то вроде

struct node *insert(struct node *root, const char id*, const char *name, const char *last_name, float grade) {
    struct node * newnode = malloc(sizeof *newnode);
    ...
    return root;
}

вне любого другого определения функции, в то время как вызов функции будет выглядеть так:

struc node *root = NULL;
char id[100], name[100], last_name[100];
float grade;
...
      if (sscanf(line,"%99s %99s %99s %f",id, name, last_name, &grade)) != 4) 
      {
      puts("invalid file");
      return;
      }
      root = insert(root, id, name, last_name, grade);  // here is the function call
...