Ir ao conteúdo
  • Cadastre-se

Ponteiros de Ponteiros


LucasRafael

Posts recomendados

Bom dia Galera

Estou com o seguinte problema...

Estou criando um programa em que existe as estruturas Aluno e Disciplina.

Na estrutura Aluno existe um ponteiro que aponta para o inicio das disciplinas do aluno.

Esta dando um erro do windows que o programa parou de funcionar, após cadastrar a disciplina para o aluno.

Eu acredito que o erro esteja na passagem de parametro do ponteiro "piniciodisciplina"

Segue codigo Fonte:

struct disciplina{int codigod, n_creditos, periodod;char nomed[50];struct disciplina *prox;};
struct aluno //Declaração da estrutura aluno{int codigo;//Atributos da estrutura alunochar nome[50], endereco[50], curso[50], periodo[50];struct aluno *proximo;struct disciplina *piniciodisciplina;};aluno al;disciplina di;
struct disciplina *pinicio;struct aluno *inicio;
void cadastra_disciplina(){int codigo, codigod;printf("\n*************** Cadastro de Disciplinas ***************\n\n\n");fflush(stdin);printf("Digite o codigo do Aluno: ");scanf("%d", &codigo);fflush(stdin);printf("\nDigite o Codigo da Disciplina: ");scanf("%d", &codigod);fflush(stdin);printf("\nDigite o Nome: ");gets(di.nomed);fflush(stdin);printf("\nDigite o Periodo: ");scanf("%d", &di.periodod);fflush(stdin);printf("\nDigite o Numeros de Creditos: ");scanf("%d", &di.n_creditos);fflush(stdin);struct aluno *aux;aux = inicio;while(aux != NULL) //Busca Aluno Para Cadastrar Disciplina{if(aux->codigo == codigo)insereOrdenado_Disciplina(codigod, &(aux->piniciodisciplina));}
}
void insereOrdenado_Disciplina(int codigod, struct disciplina **piniciodisciplina){
struct disciplina *p, *q;p = *piniciodisciplina;if((p == NULL)||(codigod < p->codigod)){
insereInicio_Disciplina(codigod, piniciodisciplina);return;}q = p;while((q!=NULL) && (q->codigod < codigod)){p=q;q = p->prox;}if((q == NULL) || (q->codigod > codigod))insereDepois_Disciplina(p, codigod);elseprintf("\nElemento já Existe");}
void insereInicio_Disciplina(int codigod, struct disciplina **piniciodisciplina){struct disciplina *d;d =(struct disciplina *)malloc(sizeof(struct disciplina));fflush(stdin);d->codigod = codigod;strcpy(d->nomed, di.nomed);d->n_creditos = di.n_creditos;d->periodod = di.periodod;fflush(stdin);system("cls"); //Limpa a Telad->prox = *piniciodisciplina;*piniciodisciplina = d;printf("Disciplina Inserida com sucesso");getch();system("cls"); //Limpa a Tela}
void insereDepois_Disciplina(struct disciplina *p, 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);fflush(stdin);system("cls"); //Limpa a Telaaux ->prox = p->prox;p->prox = aux;printf("\n\n\nDisciplina Inserida com sucesso");getch();system("cls"); //Limpa a Tela}
void percorreLista() //Faz a listagem de todas matriculas da Estrutura, e as imprimem{struct aluno *p;struct disciplina *d;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", p->periodo);fflush(stdin);
d = pinicio;while(d != NULL){printf("\n*************** Disciplinas Cadastradas ***************\n\n\n");printf("Codigo: %d \n\n" , d->codigod);printf("Nome: %s \n\n" , d->nomed);printf("Periodo: %d \n\n" , d->periodod);printf("Numero de Creditos: %d \n\n\n\n" , d->n_creditos);printf("____________________________________________________________");d = d->prox;}p = p->proximo;
}getch();system("cls"); //Limpa a Tela}
Link para o comentário
Compartilhar em outros sites

Segue codigo completo


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

struct disciplina
{
int codigod, n_creditos, periodod;
char nomed[50];
struct disciplina *prox;
};

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

struct disciplina *pinicio;
struct aluno *inicio; //Primeiro Matricula

FILE *arq;

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

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


//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(int codigod, struct disciplina **auxpiniciodisciplina);
void insereDepois_Disciplina(struct disciplina *p, int codigod);
void removeInicio_Disciplina();
void removeDepois_Disciplina(struct disciplina *p);
void insereOrdenado_Disciplina(int codigod, struct disciplina **auxpiniciodisciplina);
void remove_ordenado_Disciplina(int codigo, int codigod);
void cadastra();
void cadastra_disciplina();


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

main(){

int x = 1, codigo, codigod;
while(x != 0)
{
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 para um aluno......Digite 4:\n\n");
printf("Para remover uma Disciplina......................Digite 5:\n\n");
printf("Para sair........................................Digite 0:\n\n");

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

if(x == 1) //Insere um novo cadastro ordenadamente
cadastra();

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

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

if(x == 4)//Adiciona uma Disicplina
cadastra_disciplina();

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

}

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

}
if(x != 0 && x != 1 && x != 2 && x != 3 && x != 4 && x != 5) //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);
//Definindo atributos com base na chave código
aux->codigo = codigo;
strcpy(aux->nome, al.nome);
strcpy(aux->endereco, al.endereco);
strcpy(aux->curso, al.curso);
strcpy(aux->periodo, al.periodo);

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

printf("Aluno Inserido com sucesso");
getch();
system("cls"); //Limpa a Tela
printf("\n\nPressione qualquer tecla para voltar ao menu");
getch();
system("cls"); //Limpa a Tela
}

void removeInicio(){ // Remove o primeiro registro
struct aluno *aux;
aux = inicio;
inicio = inicio->proximo;
free(aux);
printf("Aluno removido com sucesso");
system("cls"); //Limpa a Tela
printf("\n\nPressione qualquer tecla para voltar ao menu");
getch();
}
////////////////////////////////////////////////////////////////////////////////

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
//Definindo atributos com base na chave código
aux->codigo = codigo; //Insere Codigo na Estrutura aluno
strcpy(aux->nome, al.nome);
strcpy(aux->endereco, al.endereco);
strcpy(aux->curso, al.curso);
strcpy(aux->periodo, al.periodo);
system("cls");
aux->proximo = a->proximo;
a->proximo = aux;
printf("Aluno Inserido com sucesso");
getch();
system("cls"); //Limpa a Tela
}

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);
printf("Aluno removido com sucesso");
getch();
system("cls"); //Limpa a Tela
}

////////////////////////////////////////////////////////////////////////////////
void percorreLista() //Faz a listagem de todas matriculas da Estrutura, e as imprimem
{
struct aluno *p;
struct disciplina *d;
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", p->periodo);
fflush(stdin);

d = pinicio;
while(d != NULL)
{
printf("\n*************** Disciplinas Cadastradas ***************\n\n\n");
printf("Codigo: %d \n\n" , d->codigod);
printf("Nome: %s \n\n" , d->nomed);
printf("Periodo: %d \n\n" , d->periodod);
printf("Numero de Creditos: %d \n\n\n\n" , d->n_creditos);
printf("____________________________________________________________");
d = d->prox;
}
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 ja 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
}
}
////////////////////////////////////////////////////////////////////////////////

void insereInicio_Disciplina(int codigod, struct disciplina **piniciodisciplina)
{
struct disciplina *d;
d =(struct disciplina *)malloc(sizeof(struct disciplina));
fflush(stdin);
d->codigod = codigod;
strcpy(d->nomed, di.nomed);
d->n_creditos = di.n_creditos;
d->periodod = di.periodod;
fflush(stdin);
system("cls"); //Limpa a Tela
d->prox = *piniciodisciplina;
*piniciodisciplina = d;
printf("Disciplina Inserida no inicio com sucesso");
getch();
system("cls"); //Limpa a Tela
}


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

void insereDepois_Disciplina(struct disciplina *p, 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);
fflush(stdin);
system("cls"); //Limpa a Tela
aux ->prox = p->prox;
p->prox = aux;
printf("\n\n\nDisciplina Inserida depois com sucesso");
getch();
system("cls"); //Limpa a Tela
}

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

void removeInicio_Disciplina(int codigo)
{
struct disciplina *aux;
struct aluno *p;
p = inicio;
while(p != NULL)
{
if(p->codigo == codigo)
break;
}
aux = p->piniciodisciplina;
p->piniciodisciplina=(p->piniciodisciplina)->prox;
free(aux);
printf("Disciplina Removida com sucesso");
getch();
system("cls"); //Limpa a Tela
}
////////////////////////////////////////////////////////////////////////////////
void removeDepois_Disciplina(struct disciplina *p)
{
struct disciplina *aux;
aux = p->prox;
p->prox = aux->prox;
free(aux);
printf("Disciplina Removida com sucesso");
getch();
system("cls"); //Limpa a Tela
}

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

void percorreLista_Disciplina(int codigo)
{
struct aluno *aux;
while(aux != NULL)
{
if(aux->codigo = codigo)
break;
}
struct disciplina *p;
p = aux->piniciodisciplina;
printf("***********Disciplinas Cadastradas**********\n");
while(p != NULL)
{
printf("\n\nCodigo: %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\n\n" , p->n_creditos);
printf("____________________________________________________________");
p = p->prox;
}
getch();
system("cls"); //Limpa a Tela
}
////////////////////////////////////////////////////////////////////////////////

void insereOrdenado_Disciplina(int codigod, struct disciplina **piniciodisciplina)
{

struct disciplina *p, *q;
p = *piniciodisciplina;
if((p == NULL)||(codigod < p->codigod))
{

insereInicio_Disciplina(codigod, piniciodisciplina);
return;
}
q = p;
while((q!=NULL) && (q->codigod < codigod))
{
p=q;
q = p->prox;
}
if((q == NULL) || (q->codigod > codigod))
insereDepois_Disciplina(p, codigod);
else
printf("\nElemento ja Existe");
}

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

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

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

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

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

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

void cadastra(){
int codigo;
struct aluno *x;
printf("\n*************** Matricula de Aluno ***************\n\n\n");
fflush(stdin);
printf("Digite o codigo: ");
scanf("%d", &codigo);
fflush(stdin);
printf("Digite o Nome: ");
gets(al.nome); //Insere Nome na Estrutura aluno
fflush(stdin);
printf("Digite o Curso: ");
gets(al.curso); //Insere Curso na Estrutura aluno
fflush(stdin);
printf("Digite o Endereco: ");
gets(al.endereco); //Insere Endereço na Estrutura aluno
fflush(stdin);
printf("Digite o Periodo: ");
gets(al.periodo); //Insere Periodo na Estrutura aluno
fflush(stdin);
insereOrdenado(codigo);
}

void cadastra_disciplina(){
int codigo, codigod;
printf("\n*************** Cadastro de Disciplinas ***************\n\n\n");
fflush(stdin);
printf("Digite o codigo do Aluno: ");
scanf("%d", &codigo);
fflush(stdin);
printf("\nDigite o Codigo da Disciplina: ");
scanf("%d", &codigod);
fflush(stdin);
printf("\nDigite o Nome: ");
gets(di.nomed);
fflush(stdin);
printf("\nDigite o Periodo: ");
scanf("%d", &di.periodod);
fflush(stdin);
printf("\nDigite o Numeros de Creditos: ");
scanf("%d", &di.n_creditos);
fflush(stdin);
struct aluno *aux;
aux = inicio;
while(aux != NULL) //Busca Aluno Para Cadastrar Disciplina
{
if(aux->codigo == codigo)
insereOrdenado_Disciplina(codigod, &(aux->piniciodisciplina));
}

}


Link para o comentário
Compartilhar em outros sites

Olha, resolvi o problema, mas surgiram muitos outros.

No final de cadastra_disciplina(), dentro do laço while


while(aux != NULL) //Busca Aluno Para Cadastrar Disciplina
{
if(aux->codigo == codigo)
insereOrdenado_Disciplina(codigod, &(aux->piniciodisciplina));
[B]aux = aux->proximo;[/B]
}

Senão entra num laço perpétuo.

Mas o programa quase não tem tratamento de excessões, então é fácil incluir dados inválidos, dados com mesmo código, etc. Aqui não funcionou, sempre trava em algum lugar diferente, e são tantos que o que posso dizer é : verfique o código inteiro.

-O código está bem confuso, pesquise melhor as "boas práticas de programação", são fundamentais para os outros e você próprio entender o código depois.

-Variáveis globais: evite ao máximo. Cada variável tem um escopo de ação, declare só no momento certo, mesmo que tenha que criar várias vezes.

aluno al;

disciplina di;

Totalmente desnecessários, até porque eles trabalham como auxiliares até que os dados sejam fixados na hierarquia.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!