Home > Back-end >  how to add a dynamic vector (using pointer) in struct
how to add a dynamic vector (using pointer) in struct

Time:11-30

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

  • Related