Olá Peczenyj ,
O caso é, preciso escrever um código em C, uma lista de alocação encadeada, com busca, inserção, busca por elemento chave e retirada de elementos. O programa é um sistema de Alunos e Disciplinas. Então, declarei(da minha maneira) o nó aluno, o nó disciplinas, a lista de alunos x disciplinas e etc: código abaixo. Mas ainda estou errando: algumas estruturas segundo o professor, não fazem sentido, como por exemplo: struct TpListaAluno, que ao meu entender é a declaração do nó ListaAluno…
Preciso de uma ajuda para compreender o “funcionamento” da estrutura do código. Acha que devo deletar tudo e começar denovo? Obrigada pela ajuda! 
#include <stdio.h>
#include <stdlib.h>
#include
const int TamMax = 5;
struct TpAluno{
char nome[50];
int matricula [10];
char sexo;
int RG;
};
typedef struct TpNoAluno aluno;
struct NoAluno{
struct TpAluno aluno;
struct NoAluno proximo;
};
typedef struct TpListaAluno ListaAluno;
struct TpListaAluno{
NoAluno primeiro;
NoAluno* ultimo;
};
typedef struct TpDisciplica Disciplina;
struct TpDisciplina{
char Nome[100];
int codigo;
int creditos;
int chave;
};
typedef struct TpListaAlunoDisciplina LAD;
struct TpLAD{
int matricula;
int codigo;
int semestre;
int ano;
float nota[5];
};
struct TpNoLAD {
int LAD;
struct TpNoLAD* proximo;
};
void criarListaVazia(ListaAluno* lista)
{
lista->primeiro = NULL;
lista->ultimo = NULL;
}
LAD* busca(ListaAluno lista, int matricula)
{
aluno* atual;
while atual != NULL
{
atual = atual->proximo;
return atual;
}
}
NoAluno* busca(ListaAluno lista, int matricula);
{
NoAluno* atual;
if(vaziaalunos(lista))
return NULL;
atual = lista.primeiro;
while( (atual != NULL) && (atual->aluno.matricula != matricula))
atual = atual->proximo;
return
}
NoAluno* buscaaluno(ListaAluno lista, int matricula)
{
NoAluno* atual;
if(vaziaaluno(lista))
return NULL;
atual = lista.primeiro;
while( (atual != NULL) && (atual->aluno.matricula != matricula))
atual = atual->proximo;
return atual;
}
void inseriraluno(ListaAluno *lista, Aluno aluno)
{
if(!buscaaluno(lista,aluno.matricula)){
NoAluno novo;
novo=(NoAluno *) malloc(sizeof(NoAluno));
novo->aluno = aluno;
novo->proximo=NULL;
if(vaziaaluno(*lista)){
list->primeiro=novo;
lista->ultimo=novo;
}else{
lista->ultimo->proximo=novo;
lista->ultimo=novo;
}
}else
printf(“Matrícula já existe.”);
}