Помогите с бинарным деревом на Си
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;
Вуаля - у тебя бинарное дерево.
Не знаю ответа.
Больше по теме