Top.Mail.Ru
Ответы

Помогите с бинарным деревом на Си

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
 #include <stdio.h> 
#include <stdlib.h> 
#include <locale.h> 
#include <string.h> 
 
 
typedef struct student { 
    char LastName[50]; 
    char FirstName[50]; 
    char gender; 
    int age; 
    char group[8]; 
    int mathGrade; 
    int physicsGrade; 
    int chemistryGrade; 
    struct student* next; 
} stud; 
 
 
stud* push(stud* top, const char* LastName, const char* FirstName, const char* gender, int age, const char* group, int mathGrade, int physicsGrade, int chemistryGrade ) { 
    stud* ptr = malloc(sizeof(stud)); 
    if (ptr != NULL) 
      { 
         strcpy(ptr->LastName, LastName); 
         strcpy(ptr->FirstName, FirstName); 
         ptr->gender = gender; 
         ptr->age = age; 
         strcpy(ptr->group, group); 
         ptr->mathGrade = mathGrade; 
         ptr->physicsGrade = physicsGrade; 
         ptr->chemistryGrade = chemistryGrade; 
         ptr->next = top; 
      } 
 
      return ptr; 
 
} 
 
 
void show(const stud* top) 
{ 
    const stud* current = top; 
    while(current != NULL){ 
        printf("Фамилия: %s\n", current->LastName); 
        printf("Имя: %s\n", current->FirstName); 
        printf("Пол: %c\n", current->gender); 
        printf("Возраст: %d\n", current->age); 
        printf("Группа: %s\n", current->group); 
        printf("Оценка по математике: %d\n", current->mathGrade); 
        printf("Оценка по физике: %d\n", current->physicsGrade); 
        printf("Оценка по химии: %d\n", current->chemistryGrade); 
        printf("\n"); 
        current = current->next; 
    } 
} 
 
 
void GoodJobMan(const stud* top, const char* group) { 
    const stud* current = top; 
    while(current != NULL) { 
        if(strcmp(current->group, group) == 0 && current->mathGrade == 5 && current->physicsGrade == 5 && current->chemistryGrade == 5) { 
            printf("Фамилия: %s\n", current->LastName); 
            printf("Имя: %s\n", current->FirstName); 
            printf("Пол: %c\n", current->gender); 
            printf("Возраст: %d\n", current->age); 
            printf("Группа: %s\n", current->group); 
            printf("Оценка по математике: %d\n", current->mathGrade); 
            printf("Оценка по физике: %d\n", current->physicsGrade); 
            printf("Оценка по химии: %d\n", current->chemistryGrade); 
            printf("\n"); 
        } 
        current = current->next; 
    } 
} 
 
 
 
int main() { 
    setlocale(LC_ALL, "RUS"); 
 
    stud* top = NULL; 
 
    top = push(top, "Иванов", "Иван", 'м', 17, "ИСП-204", 5, 5, 4); 
    top = push(top, "Максимов", "Максим", 'м', 16, "ИСП-204", 5, 5, 5); 
    top = push(top, "Егоров", "Егор", 'м', 15, "ИСП-205", 5, 3, 4); 
    top = push(top, "Наталиев", "Натали", 'ж', 18, "ИСП-205", 3, 2, 4); 
 
    show(top); 
 
 
    printf("|ВЫВОД ОТЛИЧНИКА|\n"); 
    GoodJobMan(top, "ИСП-204"); 
 
 
    return 0; 
} 
 
  

Тут код со стеком, хочу сделать через бинарное дерево. Понимаю как работает бинарное дерево в словах в коде не могу написать. Только знаю что в структуре напишу левую и правую часть и все!
Как можно через Бинарное дерево сделать ?

По дате
По Рейтингу
Аватар пользователя
Новичок

Во-первых, в дереве у родительского узла есть указатели на два дочерних: правый и левый.
Во-вторых, вот это вот

123
 strcpy(ptr->LastName, LastName);  
strcpy(ptr->FirstName, FirstName);  
strcpy(ptr->group, group);  

не что иное как критическая уязвимость.
НИКОГДА не используйте функции, не проверяющие переполнение буфера. strcpy, strcat и т.п. должны идти фтопку. Безопасный ввод можно сделать например так:

1
 snprintf( ptr->LastName, 50, "%s", LastName ); 

Хотя я бы изменил узел таким образом:

12345678910111213
 typedef struct Student
{  
    char* last_name;  
    char* first_name;  
    char* group;   
    char gender;  
    int age;  
    int mathGrade;  
    int physicsGrade;  
    int chemistryGrade;  
    struct student* left;  
    struct student* rigth;   
} 

Тогда в push

12345678910
 ptr->last_name = strdup(LastName);
if(ptr->last_name)
{
    //  Работаем дальше
}
else
{
    //  Обработка ошибки выделения памяти
    perror("strdup LastName");
} 

Ну и деструктор в конце нужен, память освободить.

Аватар пользователя
Искусственный Интеллект

struct student* left;
struct student* right;

Вуаля - у тебя бинарное дерево.

Аватар пользователя
Ученик

Не знаю ответа.