如何在struct中添加动态向量(使用指针)

pftdvrlh  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(66)

我正在做一个数据结构问题,它模拟了一个学生系统的二叉搜索树,但是在添加主题的部分我发现了以下问题。
problem when trying to add courses我想知道哪里出了问题,或者是否有更简单的方法来添加主题,记住学科是在结构体的向量中。

创建学生函数

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);

}

完整代码

#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;
}

我尝试使用指针创建一个动态向量,并将其添加到每个重复索引中,因为我将每个学生将要完成的科目数作为函数的输入。

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);
            
        }
l2osamch

l2osamch1#

您需要

scanf("%s", &novo->disciplinas[i].nome);

discplinas是数组,disciplina[i]是Discpilna的执行严修

相关问题