Manipulação de dados entre estruturas [RESOLVIDO]

1. Manipulação de dados entre estruturas [RESOLVIDO]

Wilson
wilsonppjr

(usa Ubuntu)

Enviado em 13/09/2010 - 14:33h

Tenho duas estruturas aluno e disciplina, onde dentro da estrutura aluno existe a estrutura disciplina. Queria inserir os dados na disciplina pela estrutura aluno, e não encontrei meios para tal. Se alguém puder ajudar, grato desde já. Segue o código:

/*Wilson Pedroso email: wilsonppjr@gmail.com*/

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

struct aluno //Declaração da estrutura aluno
{
int codigo;
char nome[50], endereco[50], curso[50], periodo[50];
struct disciplina; //Atributos da estrutura aluno
struct aluno *proximo;
};

struct aluno *inicio; //Primeiro Matricula

////////////////////////////////////////////////////////////////////////////////
struct disciplina
{
int codigod, n_creditos, periodod;
char nomed[50];
struct disciplina *esq, *dir;
};
struct disciplina *pinicio;

////////////////////////////////////////////////////////////////////////////////


//SubRotinas Utilizadas
//Aluno
void insereInicio(int codigo);
void removeInicio();
void insereDepois(struct aluno *a, int codigo);
void remove_depois(struct aluno *a);
void percorreLista();
void insereOrdenado(int codigo);
void remove_ordenado(int codigo);
//Disciplina
void insereInicio_Disciplina(struct disciplina **pinicio, int codigod);
void insereDepois_Disciplina(struct disciplina *p, int codigod);
void removeInicio_Disciplina(struct disciplina **pinicio);
void removeDepois_Disciplina(struct disciplina *p);
void percorreLista_Disciplina(struct disciplina *pinicio);
void insereOrdenado_Disciplina(struct disciplina **pinicio, int codigod);
void remove_ordenado_Disciplina(struct disciplina **pinicio, int codigod);
void buscaAluno(int codigo);


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

main(){
int x = 1, codigo, codigod;
while(x != 7)
{
printf("\n*************** Matricula de Aluno ***************\n\n\n");
//Menu
printf("Para cadastrar um novo Aluno.....................Digite 1:\n\n");
printf("Para imprimir a lista de alunos..................Digite 2:\n\n");
printf("Para remover um Aluno............................Digite 3:\n\n");
printf("Para adicionar uma Disciplina....................Digite 4:\n\n");
printf("Para remover uma Disciplina......................Digite 5:\n\n");
printf("Para imprimir lista de disciplinas de um Aluno...Digite 6:\n\n");
printf("Para sair........................................Digite 7:\n\n");

printf("Escolha: ");
scanf("%d", &x);
system("cls"); //Limpa a Tela

if(x == 1) //Insere uma nova matrícula ordenadamente
{
printf("\n*************** Matricula de Aluno ***************\n\n\n");
fflush(stdin);
printf("Digite o codigo: ");
scanf("%d", &codigo);
fflush(stdin);
insereOrdenado(codigo);
}

if(x == 2)//Imprime a lista de alunos
percorreLista();

if(x == 3)// Remove Aluno Ordenadamente
{
printf("Digite o codigo: ");
scanf("%d", &codigo);
remove_ordenado(codigo);
}

if(x == 4)//Adiciona uma Disicplina
{
printf("\n*************** Cadastro de Disciplinas ***************\n\n\n");
fflush(stdin);
printf("Digite o codigo: ");
scanf("%d", &codigod);
fflush(stdin);
insereOrdenado_Disciplina(&pinicio,codigod);

//printf("Digite o Codigo do Aluno: ");
//scanf("%d", &codigo);
}
if(x == 5)//Remove Uma Disciplna
{

printf("Digite o codigo: ");
scanf("%d", &codigod);
remove_ordenado_Disciplina(&pinicio,codigod);

}
if(x == 6)//Imprime Lista de Disciplinas de um Alunos
{
percorreLista_Disciplina(pinicio);
}

if(x == 7)// Sair
{
system("cls"); //Limpa a Tela
printf("\n\nPressione qualquer tecla para sair....");
getch();

}
if(x<1||x>7) //Verifica se foi digitado um valor valido de 1 a 7
{
system("cls"); //Limpa a Tela
printf("\n\nValor Invalido!\n\nDigite Novamente\n\n");
}
}//Fim do While
}//Fim do Main

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


void insereInicio(int codigo){// Insere um novo Aluno no ínicio da Fila, Passando todos atributos por referência
struct aluno *aux;
aux =(struct aluno*)malloc(sizeof(struct aluno)); //Aloca Espaço na Memoria
fflush(stdin);
//Inserção no Arquivo
FILE *f1;
if((f1 = fopen("C:\\Cadastro_Alunos.txt","w")) == NULL)
{
printf("Arquivo nao pode ser aberto.");
getch();
}

//Definindo atributos com base na chave código
aux ->codigo = codigo;
fprintf(f1, "%d\n" ,codigo); //Insere No arquivo

printf("Digite o Nome: ");
gets(aux->nome); //Insere Na Estrutura aluno
fprintf(f1, "Nome = %s\n" ,aux->nome); //Insere No arquivo
fflush(stdin);

printf("Digite o Curso: ");
gets(aux->curso); //Insere Na Estrutura aluno
fprintf(f1, "Curso = %s\n" ,aux->curso); //Insere No arquivo
fflush(stdin);

printf("Digite o Endereco: ");
gets(aux->endereco); //Insere Na Estrutura aluno
fprintf(f1, "Endereco = %s\n" ,aux->endereco); //Insere No arquivo
fflush(stdin);

printf("Digite o Periodo: ");
gets(aux->periodo); //Insere Na Estrutura aluno
fprintf(f1, "Periodo = %s\n" ,aux->periodo); //Insere No arquivo
fflush(stdin);

system("cls"); //Limpa Tela
aux->proximo = inicio;
inicio = aux;


}

void removeInicio(){ // Remove o primeiro registro
struct aluno *aux;
aux = inicio;
inicio = inicio->proximo;
free(aux);
}


////////////////////////////////////////////////////////////////////////////////

void insereDepois(struct aluno *a, int codigo){ //Insere uma matrícula após outra matrícula específica
struct aluno *aux,c;
aux =(struct aluno*)malloc(sizeof(struct aluno)); //Aloca Espaço na Memoria
aux->codigo = codigo;

//Definindo atributos com base na chave código
printf("Digite o Nome: ");
gets(aux->nome);
fflush(stdin);
printf("Digite o Curso: ");
gets(aux->curso);
fflush(stdin);
printf("Digite o Endereco: ");
gets(aux->endereco);
printf("Digite o Periodo: ");
gets(aux->periodo);
fflush(stdin);
system("cls");
aux->proximo = a->proximo;
a->proximo = aux;
}

void remove_depois(struct aluno *a){ // Remove uma matrícula após outra matrícula específica
struct aluno *aux;
aux = a->proximo;
a->proximo = aux->proximo;
free(aux);
system("cls"); //Limpa a Tela
}

////////////////////////////////////////////////////////////////////////////////
void percorreLista() //Faz a listagem de todas matriculas da Estrutura, e as imprimem
{
struct aluno *p;
p = inicio;
printf("\n*************** Alunos Matriculados ***************\n\n\n");
while(p != NULL)
{
fflush(stdin);

printf("Codigo = %d \n\n", p->codigo);
fflush(stdin);
printf("Nome = %s\n\n" ,p->nome);
fflush(stdin);
printf("Endereco = %s \n\n" , p->endereco);
fflush(stdin);
printf("Curso = %s \n\n", p->curso);
fflush(stdin);
printf("Periodo = %s \n\n\n\n\n", p->periodo);
fflush(stdin);
p = p->proximo;

}
getch();
system("cls"); //Limpa a Tela
}

////////////////////////////////////////////////////////////////////////////////

void insereOrdenado(int codigo)
/*Insere um valor na lista de alunos de acordo com seu código*/
{
struct aluno *p, *q;
p = inicio;
if((p == NULL)||(codigo < p->codigo))
{
insereInicio(codigo);
return;
}

q = p;
while((q != NULL) && (q->codigo < codigo))
{
p = q;
q = p->proximo;
}
if((q == NULL) || (q->codigo > codigo))
insereDepois(p,codigo);
else
printf("\nElemento já Existe");
}



void remove_ordenado(int codigo)
{
struct aluno *p, *q;
p = inicio;
if (p == NULL)
{
printf("\n\nLista Vazia!");
getch();
system("cls"); //Limpa a Tela
return;
}
if (codigo == p->codigo)
{
removeInicio();
return;
}
q = p;
while(q != NULL && q->codigo < codigo)
{
p = q;
q = p->proximo;
}
if (q!=NULL && q->codigo == codigo)
remove_depois(p);
else
{
printf("\n\nElemento nao Cadastrado!");
getch();
system("cls"); //Limpa a Tela
}
}
////////////////////////////////////////////////////////////////////////////////
/*Estrutura disciplina*/
void insereInicio_Disciplina(struct disciplina **pinicio, int codigod)
{
struct disciplina *aux;
aux=(struct disciplina *)malloc(sizeof(struct disciplina));
aux->codigod = codigod;
fflush(stdin);
printf("\nDigite o Nome: ");
gets(aux->nomed);
fflush(stdin);
printf("\nDigite o Periodo: ");
scanf("%d", &aux->periodod);
fflush(stdin);
printf("\nDigite o Numeros de Creditos: ");
scanf("%d", &aux->n_creditos);
system("cls"); //Limpa a Tela
aux->dir = *pinicio;
aux->esq = NULL;
if (*pinicio != NULL)
(*pinicio)->esq = aux;
*pinicio=aux;
}

////////////////////////////////////////////////////////////////////////////////

void insereDepois_Disciplina(struct disciplina *p, int codigod)
{
struct disciplina *aux;
aux=(struct disciplina *)malloc(sizeof(struct disciplina));
aux ->codigod = codigod;
printf("\nDigite o Nome: ");
gets(aux->nomed);
fflush(stdin);
printf("\nDigite o Periodo: ");
scanf("%d", &aux->periodod);
fflush(stdin);
printf("\nDigite o Numeros de Creditos: ");
scanf("%d", &aux->n_creditos);
system("cls"); //Limpa a Tela
aux ->dir=p->dir;
aux ->esq=p;
if (p->dir!=NULL)
(p->dir)->esq = aux;
p->dir=aux;
}

////////////////////////////////////////////////////////////////////////////////

void removeInicio_Disciplina(struct disciplina **pinicio)
{
struct disciplina *aux;
aux = *pinicio;
*pinicio=(*pinicio)->dir;
if(*pinicio != NULL)
(*pinicio)->esq=NULL;
free(aux);
}
////////////////////////////////////////////////////////////////////////////////
void removeDepois_Disciplina(struct disciplina *p)
{
struct disciplina *aux;
aux = p->dir;
p->dir = aux->dir;
if (aux->dir != NULL)
(aux->dir)->esq=p;
free(aux);
}

////////////////////////////////////////////////////////////////////////////////

void percorreLista_Disciplina(struct disciplina *pinicio)
{
struct disciplina *p;
p = pinicio;
while(p != NULL)
{
printf("Codigo: %d \n\n" , p->codigod);
printf("Nome: %s \n\n" , p->nomed);
printf("Periodo: %d \n\n" , p->periodod);
printf("Numero de Creditos: %d \n\n" , p->n_creditos);
p = p->dir;
getch();
system("cls"); //Limpa a Tela
}
getch();
}
////////////////////////////////////////////////////////////////////////////////

void insereOrdenado_Disciplina(struct disciplina **pinicio, int codigod)
{
struct disciplina *p, *q;
p = *pinicio;
if((p==NULL)||(codigod < p->codigod))
{
insereInicio_Disciplina(pinicio, codigod);
return;
}
q=p;
while((q!=NULL) && (q->codigod < codigod))
{
p=q;
q=p->dir;
}
if((q==NULL) || (q->codigod > codigod))
insereDepois_Disciplina(p, codigod);
else
printf("\nElemento já Existe");
}

////////////////////////////////////////////////////////////////////////////////

void remove_ordenado_Disciplina(struct disciplina **pinicio, int codigod)
{
struct disciplina *p,*q;
p =*pinicio;

if (p==NULL)
{
printf("lista vazia");
getch();
return;
}

if (codigod == p->codigod)
{
removeInicio_Disciplina(pinicio);
return;
}
q = p ;

while (q !=NULL && q->codigod < codigod )
{
p = q;
q = p->dir;
}
if (q!=NULL && q->codigod == codigod)
removeDepois_Disciplina(p);
else
{
printf("\nElemento nao Cadastrado");
getch();
}
}





  


2. MELHOR RESPOSTA

Ezequias Rocha
Ezequias Rocha

(usa Ubuntu)

Enviado em 13/09/2010 - 15:30h

Boa tarde wilson,

Primeiramente, aconselho a utilizar declarações de tipo:

typedef struct//Declaração de um novo tipo de variável estruturada - disciplina
{
int codigod, n_creditos, periodod;
char nomed[50];
}disciplina;

typedef struct //Declaração de um novo tipo de variável estruturada - aluno
{
int codigo;
char nome[50], endereco[50], curso[50], periodo[50];
disciplina disciplinad; //Um dos elementos desta estrutura é uma variável do tipo //"disciplina", chamada de "disciplinad"
}aluno;

aluno *inicio; //Primeiro Matricula

/* Faltam alocações de memória */

////////////////////////////////////////////////////////

No momento de acessar elementos de "disciplinad", pertencentes a "inicio", você provavelmente irá utilizar:

inicio->disciplinad.codigod = FIRSTCODE;//Como exemplo, dando o valor do macro FIRSTCODE ao
//campo "codigod" pertencente à variável "disciplinad", que é do tipo "disciplina", dentro da estrutura da variável "inicio", que é do tipo "aluno".

Enfim, para melhor entendimento, procure pelo tópico "estruturas" dentro de tutoriais de C.

Embraces!