我正在做一个数据结构问题,它模拟了一个学生系统的二叉搜索树,但是在添加主题的部分我发现了以下问题。
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);
}
1条答案
按热度按时间l2osamch1#
您需要
discplinas是数组,disciplina[i]是Discpilna的执行严修