A questão e o seguinte!
Dadas as seguintes estruturas: struct listaDisciplina{ int código; char nome[50]; float nota; float frequência; struct listaDisciplina *próximo; }; struct listaAluno{ int código; char nome[50]; struct listaAluno *próximo; struct listaDisciplina *disc; }; Escrever um programa em C que contenha funções para inserir elementos na lista de alunos, alterar elementos na lista de alunos, excluir elementos da lista de alunos e mostrar elementos da lista de alunos. Na inclusão de elementos na lista de alunos, atribuir NULL para disc. Um aluno só pode ser excluído se não existir disciplina associada a ele, ou seja, o atributo disc deve ter o valor igual a NULL. O código é o campo chave, ou seja, não pode ter código duplicado. O programa deve ter funções para inserir, alterar, excluir e mostrar elementos na lista de disciplinas. Cada aluno pode ter uma lista de disciplina associada. O ponteiro disc da lista de alunos é o ponteiro início para a lista. O programa deverá mostrar os alunos e suas respectivas disciplinas, indicando se foi aprovado ou reprovado em algumas delas. Para ser aprovado a nota precisa ser maior ou igual a 6.0 e a frequência ser maior ou igual a 75. O programa deve ter menu com as opções para a lista de alunos e para a lista de disciplina.
//Trabalho
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
struct listaAluno
{
int codigo;
char nome[50];
struct listaAluno * proximo;
struct listaDisciplina * disc;
};
struct listaAluno * insereInicio (struct listaAluno *pinicio, int x, char y [] )
{
struct listaAluno *aux;
aux=(listaAluno *)malloc(sizeof(listaAluno));
aux ->codigo = x;
strcpy(aux->nome, y);
aux ->proximo=pinicio;
pinicio=aux;
return pinicio;
}
void insereDepois(struct listaAluno *p, int x, char y [])
{
struct listaAluno *aux;
aux=(listaAluno *)malloc(sizeof(struct listaAluno));
aux ->codigo=x;
strcpy(aux->nome, y);
aux ->proximo=p->proximo;
p->proximo=aux;
}
struct listaAluno * insereOrdenado(struct listaAluno *pinicio, int x, char y[])
{
struct listaAluno *p, *q;
if((pinicio == NULL)||(x<pinicio->codigo))
{
return (insereInicio(pinicio, x, y));
}
p=pinicio;
q=p;
while((q!=NULL) && (q->codigo<x))
{
p=q;
q=p->proximo;
}
if((q==NULL) || (q->codigo>x))
insereDepois(p,x,y);
else
printf("\nCodigo ja existe");
getch();
return pinicio;
}
struct listaAluno * removeInicio(struct listaAluno * pinicio)
{ struct listaAluno *aux;
aux = pinicio;
pinicio = pinicio->proximo;
free(aux);
return pinicio;
}
void removeDepois(struct listaAluno *p)
{
struct listaAluno *aux;
aux = p->proximo;
p->proximo = aux->proximo;
free(aux);
}
struct listaAluno * removeOrdenado(struct listaAluno * pinicio, int x)
{
struct listaAluno *p,*q;
if (pinicio==NULL)
{ printf("lista vazia");
getch();
return pinicio;
}
if (x == pinicio->codigo)
{ return (removeInicio(pinicio));
}
p = pinicio;
q = p ;
while ( q !=NULL && q->codigo < x )
{
p = q;
q = p->proximo;
}
if (q!=NULL && q->codigo == x)
removeDepois(p);
else
{ printf("\nElemento nao Cadastrado");
getch();
}
return pinicio;
}
//....................................Disciplina..............................//
//....................................//////////..............................//
struct listaDisciplina{
int codigo;
char nome[50];
float nota;
float frequencia;
struct listaDisciplina * proximo1;
};
struct listaDisciplina * iniciarLista (struct listaDisciplina *pinicio1, int x, char y [] )
{
struct listaDisciplina *aux;
aux=(listaDisciplina *)malloc(sizeof(listaDisciplina));
aux ->codigo = x;
strcpy(aux->nome, y);
aux ->proximo1=pinicio1;
pinicio1=aux;
return pinicio1;
}
void insereDepois(struct listaDisciplina *p, int x, char y [])
{
struct listaDisciplina *aux;
aux=(listaDisciplina *)malloc(sizeof(struct listaDisciplina));
aux ->codigo=x;
strcpy(aux->nome, y);
aux ->proximo1=p->proximo1;
p->proximo1=aux;
}
struct listaDisciplina * insereOrdenado(struct listaDisciplina *pinicio1, int x, char y[])
{
struct listaDisciplina *p, *q;
if((pinicio1 == NULL)||(x<pinicio1->codigo))
{
return (iniciarLista(pinicio1, x, y));
}
p=pinicio1;
q=p;
while((q!=NULL) && (q->codigo<x))
{
p=q;
q=p->proximo1;
}
if((q==NULL) || (q->codigo>x))
insereDepois(p,x,y);
else
printf("\nElemento j? Existe");
return pinicio1;
}
/*void mostraElementosDisciplina(struct listaDisciplina *pinicio1)
{
struct listaDisciplina *p;
p=pinicio1;
system("cls");
while(p != NULL)
{
printf("%d , %s", p->codigo, p->nome);
p=p->proximo;
}
getch();
}
*/
struct listaDisciplina * removeInicio(struct listaDisciplina * pinicio1)
{ struct listaDisciplina *aux;
aux = pinicio1;
pinicio1 = pinicio1->proximo1;
free(aux);
return pinicio1;
}
void removeDepois(struct listaDisciplina *p)
{
struct listaDisciplina *aux;
aux = p->proximo1;
p->proximo1 = aux->proximo1;
free(aux);
}
struct listaDisciplina * removeOrdenado1(struct listaDisciplina * pinicio1, int x)
{
struct listaDisciplina *p,*q;
if (pinicio1==NULL)
{ printf("lista vazia");
getch();
return pinicio1;
}
if (x == pinicio1->codigo)
{
return (removeInicio(pinicio1));
}
p = pinicio1;
q = p ;
while ( q !=NULL && q->codigo < x )
{
p = q;
q = p->proximo1;
}
if (q!=NULL && q->codigo == x)
removeDepois(p);
else
{ printf("\nElemento nao Cadastrado");
getch();
}
return pinicio1;
}
void mostraElementos(struct listaAluno *pinicio, struct listaDisciplina *pinicio1)
{
struct listaAluno *p;
struct listaDisciplina *q;
p=pinicio;
q=pinicio1;
system("cls");
while(p != NULL)
{
printf("\n........................................");
printf("\nCogigo do aluno: %d ", p->codigo);
printf("\nNome do aluno: %s ", p->nome);
printf("\nCodigo da disciplina: %d", q->codigo);
printf("\nMateria %s", q->nome);
p=p->proximo;
q=q->proximo1;
}
getch();
}
//******************//--------------------//
//buscar//
void buscar (listaAluno* pinicio, int n, char c[])
{
struct listaAluno* p;
struct listaDisciplina *q;
p=pinicio;
for (p=pinicio; p!=NULL; p=p->proximo)
if(n!=NULL)
printf("\n........................................");
printf("\nCodigo do aluno: %d ", n);
printf("\nNome do aluno: %s ", c);
printf("\nCodigo da disciplina:");
printf("\nMateria:");
getch();
}
//-----------------//****************//
//.......................................MENU..............................................//
int menuOpcao()
{
int i;
while(1)
{
system("cls");
printf("\n 1 - Inserir ");
printf("\n 2 - Mostra ");
printf("\n 3 - Retirar ");
printf("\n 4 - Buscar ");
printf("\n 5 - Sair ");
printf("\nDigite a Opcao Desejada: ");
scanf("%d",&i);
if((i<1)||(i>5))
{
printf("\nOpcao INVALIDA...Informe 1, 2, 3 ou 4 \n\n");
getch();
}
else
return i;
}
}
//.............................................main.........................//
main()
{
int opcao, n,d, codD;
char nome[50], disciplina[50];
struct listaAluno * inicio;
inicio=NULL;
struct listaDisciplina * inicio1;
while(1)
{
if((opcao=menuOpcao())==5)
break;
if(opcao==1)
{
printf("\nCodigo: ");
scanf("%d",&n);
printf("\nNome do Aluno(a): ");
scanf("%s", nome);
inicio=insereOrdenado(inicio,n, nome);
printf("\nCodigo da Disciplina: ");
scanf("%d",&codD);
printf("\nMateria: ");
scanf("%s", disciplina);
inicio1=insereOrdenado(inicio1,codD,disciplina);
}
if(opcao==2)
{
mostraElementos(inicio, inicio1);
getch();
}
if(opcao==3)
{
printf("\nRemover Cod.");
scanf("%d",&n);
inicio = removeOrdenado(inicio,n);
inicio1 = removeOrdenado1(inicio1,n);
}
if(opcao==4)
{
printf("\n\nDigite o codigo: ");
scanf("%d", &n);
buscar(inicio, n, nome);
getch();
}
}
}
alguma dica para conseguir fazer isso?