I'm doing a data structure question where it simulates a binary search tree for a student system, however in the part of adding subjects I found the following problem.
problem when trying to add courses I would like to know what is wrong, or if there is a simpler way to add the subjects,remembering that the disciplines are in a vector of structs.
create student function
void criar_aluno(int matricula,char *nome,int numdisciplinas){
Aluno *novo = malloc(sizeof(Aluno));
novo -> matricula = matricula;
novo -> nome = nome;
novo -> esq = NULL;
novo -> dir = NULL;
//Criando as disciplinas do aluno
novo -> disciplinas = malloc(sizeof(Disciplina) * numdisciplinas);
for (int i = 0; i < numdisciplinas; i ){
printf("Digite o nome da disciplina: ");
scanf("%s",&novo -> disciplinas[i] -> nome);
scanf("%c");
printf("\nDigite o codigo da disciplina: ");
scanf("%d",&novo -> disciplinas[i] -> codigo);
printf("\nDigite a nota final da disciplina: ");
scanf("%f",&novo -> disciplinas[i] -> nota);
}
adicionar_aluno(novo);
}
full code
#include <stdio.h>
#include <stdlib.h>
typedef struct disciplina{
int codigo;
char *nome;
float nota;
}Disciplina;
typedef struct aluno{
int matricula;
char *nome;
struct aluno *esq;
struct aluno *dir;
Disciplina *disciplinas;
}Aluno;
Aluno *raiz = NULL;
Aluno* buscar_aluno(int matricula, Aluno *aux){
if(aux == NULL){
return NULL; //vazia
}else if(matricula == aux->matricula){
return aux; //encontrei :D
}else if(matricula<aux->matricula){ //buscar no lado esq
if(aux->esq != NULL){
return buscar_aluno(matricula, aux->esq);
}else{//esq esta vazia
return aux; //pai do elemento que não foi encontrado
}
}else{//buscar no lado dir
if(aux->dir != NULL){
return buscar_aluno(matricula, aux->dir);
}else{//dir esta vazia
return aux; //pai do elemento que não foi encontrado
}
}
}
void adicionar_aluno(Aluno *aluno){
Aluno *aux = buscar_aluno(aluno -> matricula, raiz);
//Testando se a matricula já existe dentro da árvore
if (aux != NULL && aux -> matricula == aluno -> matricula){
printf("Operacao invalida \n");
}else{
//Se a árvore estiver vazia
if(aux == NULL){
raiz = aluno;
}else{
//Se a matricula for menor que a matricula do pai ele ira para a esquerda
if(aluno -> matricula < aux -> matricula){
aux -> esq = aluno;
}else{ //Se a matricula for maior que a matricula do pai ele ira para a direita
aux -> dir = aluno;
}
}
}
}
void criar_aluno(int matricula,char *nome,int numdisciplinas){
Aluno *novo = malloc(sizeof(Aluno));
novo -> matricula = matricula;
novo -> nome = nome;
novo -> esq = NULL;
novo -> dir = NULL;
//Criando as disciplinas do aluno
novo -> disciplinas = malloc(sizeof(Disciplina) * numdisciplinas);
for (int i = 0; i < numdisciplinas; i ){
printf("Digite o nome da disciplina: ");
scanf("%s",&novo -> disciplinas[i] -> nome);
scanf("%c");
printf("\nDigite o codigo da disciplina: ");
scanf("%d",&novo -> disciplinas[i] -> codigo);
printf("\nDigite a nota final da disciplina: ");
scanf("%f",&novo -> disciplinas[i] -> nota);
}
adicionar_aluno(novo);
}
void buscar_dados(int matricula){
Aluno *aux = buscar_aluno(matricula, raiz);
if (aux -> matricula != matricula){
printf("Aluno nao encontrado \n");
}else{
printf("Matricula do aluno: %d | Nome do aluno: %s ",aux -> matricula, aux -> nome);
printf("Nome da disciplina: %s | Codigo da disciplina: %d | Nota final da disciplica: %f", aux -> disciplinas -> nome, aux -> disciplinas -> codigo, aux -> disciplinas -> nota);
}
}
Aluno* remover_aluno(int matricula, Aluno *aux){
if(aux == NULL){
printf("Valor nao encontrado!\n");
return NULL;
} else { // Procurando o nó para remover
if(aux->matricula == matricula) {
// Remove nós folhas (sem filhos)
if(aux->esq == NULL && aux->dir == NULL) {
free(aux);
return NULL;
}else if(aux -> esq != NULL && aux -> dir != NULL){
//Removendo nós com dois filhos
}else{
//Removendo nós com apenas um filho
Aluno *filho;
if(aux -> esq != NULL){
filho = aux -> esq;
}else{
filho = aux -> dir;
}
free(aux);
return filho;
}
}else{
if(matricula < aux -> matricula){
aux -> esq = remover_aluno(matricula, aux -> esq);
}else{
aux -> dir = remover_aluno(matricula, aux -> dir);
}
return aux;
}
}
}
void in_ordem(Aluno* aux){
if (aux != NULL){
in_ordem(aux -> esq);
printf("%d ", aux -> matricula);
in_ordem(aux -> dir);
}
}
int main(){
criar_aluno(20,"Joao",1);
// criar_aluno(10,"Pedro",2);
// criar_aluno(30,"Vitor",3);
// criar_aluno(40,"Ana",2);
// criar_aluno(5,"Vitoria",3);
// in_ordem(raiz);
// printf("\n");
//remover_aluno(10,raiz);
//in_ordem(raiz);
//buscar_dados(20);
return 0;
}
I tried to create a dynamic vector using a pointer and add it to each repetition index, since I have as input to the function the number of subjects that each student will complete.
novo -> disciplinas = malloc(sizeof(Disciplina) * numdisciplinas);
for (int i = 0; i < numdisciplinas; i ){
printf("Digite o nome da disciplina: ");
scanf("%s",&novo -> disciplinas[i] -> nome);
scanf("%c");
printf("\nDigite o codigo da disciplina: ");
scanf("%d",&novo -> disciplinas[i] -> codigo);
printf("\nDigite a nota final da disciplina: ");
scanf("%f",&novo -> disciplinas[i] -> nota);
}
CodePudding user response:
you need
scanf("%s", &novo->disciplinas[i].nome);
discplinas is an array, disciplina[i] is an instance of Discpilna