Ir para conteúdo

POWERED BY:

Arquivado

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

Diego Moco

Imprimindo "lixo" na lista encadeada

Recommended Posts

Bom acho que o meu código ta certo, aparentemente está funcionando até quando peço para imprimir o nome e a matricula dos indivíduos. É aí que invés de imprimir o nome e a matricula ele imprime só "lixo"(uns %%$## um coraçãoziho e tals)

 

Vopu postar o codigo todo, mas só estou com problema na impressão mesmo, se alguem puder me audar....

 

CODE
#include<conio.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

struct lista

{

char nome[81];

char matricula[8];

char turma[20];

float p1;

float p2;

float p3;

struct lista* prox; //Definindo Lista

};

 

typedef struct lista Lista;

 

Lista* preenche(Lista* l,char nome[81], char matricula[8], char turma[20], float p1, float p2, float p3);

Lista* inicializa(); //protótipos

int imprime(Lista* l);

Lista* remove(Lista* l, char apagar[8]);

 

Lista* inicializa()

{

return(NULL); //Função que inicializa a lista

}

 

Lista* preenche(Lista* l,char nome[81], char matricula[8], char turma[20], float p1, float p2, float p3)

{

Lista* novo=(Lista*) malloc(sizeof(Lista)); //Função que Preenche a lista

novo->nome[81]=nome[81];

novo->matricula[8]=matricula[8];

novo->turma[20]=turma[20];

novo->p1=p1;

novo->p2=p2;

novo->p3=p3;

novo->prox=l;

return novo;

}

 

int imprime(Lista* l)

{

Lista* p;

printf("**********************************\n");

for(p=l;p!=NULL;p=p->prox) //Função que imprime os itens da lista

{

 

printf("**\tmatricula = %s\t\t**\n", p->matricula);

printf("**\tnome = %s\t\t**\n", p->nome);

printf("**\taponta para = %p\t**\n", p->prox);

}

printf("**********************************\n");

}

 

Lista* remove(Lista* l, char apagar[8])

{

Lista* ant=NULL;

Lista* p=l;

while(p!=NULL&&strcmp(apagar,p->matricula))

{

ant=p;

p=p->prox;

}

if(p==NULL)

{

printf("\nNumero nao encontrado na lista"); //Função de Remoção

return l;

}

if(ant==NULL)

{

l=p->prox;

}

else

{

ant->prox=p->prox;

}

free(p);

return l;

}

 

 

int main()

{

Lista *l;

int opcao=0;

char apagar[8];

char nome[81];

char matricula[8];

char turma[20];

float p1;

float p2;

float p3;

 

while(opcao!=5){

printf("\n1---Inicializar");

printf("\n2---Preenchimento"); //Método Main

printf("\n3---Remocao");

printf("\n4---Imprime os numeros da lista");

printf("\n5---Fim\n\n");

scanf("%d",&opcao);

switch(opcao)

{

case 1: {l=inicializa();

break;}

 

case 2: {fflush(stdin);

printf("\nDigite o nome do aluno a ser cadastrado: \n");

scanf("%s",&nome);

printf("\nDigite o numero da matricula: \n");

scanf("%s",&matricula);

printf("\nDigite a turma: \n");

scanf("%s",&turma);

printf("\nDigite a 1ª nota do aluno: \n");

scanf("%f",&p1);

printf("\nDigite a 2ª nota do aluno: \n");

scanf("%f",&p2);

printf("\nDigite a 3ª nota do aluno: \n");

scanf("%f",&p3);

l=preenche(l,nome,matricula,turma,p1,p2,p3);

break;}

 

case 3: {printf("\nDigite o numero da matricula para excluir o aluno da lista\n");

scanf("%s",&apagar);

remove(l,apagar);

break;}

 

case 4: {imprime(l);

break;}

 

case 5: {printf("\nSaindo...");

break;}

 

default:{printf("\nOpcao invalida\n");}

}

}

getch();

return(0);

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

novo->nome[81]=nome[81];
novo->matricula[8]=matricula[8];
novo->turma[20]=turma[20];

Não faça isso.. você está definindo para a lista apenas um char da string que foi passada, e pior: um char inexistente. nome[81] vai de nome[0] a nome[80]. E pior ainda, você só está definindo um char da string da lista também, e pior ainda, um char inexistente, pelo mesmo motivo.

Se você quer definir as strings, creio que só fazer novo->nome = nome; vai dar problema e não vai compilar, mas você pode usar a função strcopy (dê uma pesquisada) para copiar a string ou se estiver se sentindo entediado pode fazer a sua própria apesar de eu achar desnecessário mas tem gente que gosta...

Compartilhar este post


Link para o post
Compartilhar em outros sites

novo->nome[81]=nome[81];
novo->matricula[8]=matricula[8];
novo->turma[20]=turma[20];

Não faça isso.. você está definindo para a lista apenas um char da string que foi passada, e pior: um char inexistente. nome[81] vai de nome[0] a nome[80]. E pior ainda, você só está definindo um char da string da lista também, e pior ainda, um char inexistente, pelo mesmo motivo.

Se você quer definir as strings, creio que só fazer novo->nome = nome; vai dar problema e não vai compilar, mas você pode usar a função strcopy (dê uma pesquisada) para copiar a string ou se estiver se sentindo entediado pode fazer a sua própria apesar de eu achar desnecessário mas tem gente que gosta...

Consertei aqui e estou postando o codigo consertado...

Só que apareceu outro problema, o for da função imprimir está imprimindo apenas o último item adicionado na lista, o que pode estar acontecendo? que droga

CODE
#include<conio.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

struct lista

{

char nome[81];

char matricula[8];

char turma[20];

float p1;

float p2;

float p3;

struct lista *prox; //Definindo Lista

};

 

typedef struct lista Lista;

 

Lista* preenche(Lista* turmas,char nome[81], char matricula[8], char turma[20], float p1, float p2, float p3);

Lista* inicializa(); //protótipos

int imprime(Lista* turmas, float medias);

Lista* remove(Lista* turmas, char apagar[8]);

 

Lista* inicializa()

{

return(NULL); //Função que inicializa a lista

}

 

Lista* preenche(Lista* turmas,char nome[81], char matricula[8], char turma[20], float p1, float p2, float p3)

{

turmas=NULL;

Lista* novo=(Lista*) malloc(sizeof(Lista)); //Função que Preenche a lista

strcpy(novo->nome, nome);

strcpy(novo->matricula, matricula);

strcpy(novo->turma, turma);

novo->p1=p1;

novo->p2=p2;

novo->p3=p3;

novo->prox=turmas;

return novo;

}

 

int imprime(Lista* turmas, float medias)

{

Lista* p;

 

printf("**********************************\n");

for(p=turmas;p!=NULL;p=p->prox) //Função que imprime os itens da lista

{

printf("um\n");

media=((p->p1+p->p2+p->p3)/3);

if (media>(medias-1))

{

printf("%s, %s, %s, %.2f\n",p->matricula,p->nome,p->turma,media);

}

else{}

}

printf("**********************************\n");

}

 

 

Lista* remove(Lista* turmas, char apagar[8])

{

Lista* ant=NULL;

Lista* p=turmas;

while(p!=NULL&&strcmp(apagar,p->matricula))

{

ant=p;

p=p->prox;

}

if(p==NULL)

{

printf("\nNumero nao encontrado na lista"); //Função de Remoção

return turmas;

}

if(ant==NULL)

{

turmas=p->prox;

}

else

{

ant->prox=p->prox;

}

free(p);

return turmas;

}

 

 

int main()

{

Lista *turmas;

int opcao=1;

char apagar[8];

char nome[81];

char matricula[8];

char turma[20];

float p1;

float p2;

float p3;

float medias;

 

while(opcao!=6){

printf("\n1---Inicializar");

printf("\n2---Preenchimento"); //Método Main

printf("\n3---Remocao");

printf("\n4---Imprime os alunos da lista");

printf("\n5---Imprime os alunos da lista");

printf("\n6---Fim\n\n");

scanf("%d",&opcao);

 

switch(opcao)

{

case 1: {turmas=inicializa();

break;}

 

case 2: {fflush(stdin);

printf("\nDigite o nome do aluno a ser cadastrado: \n");

scanf("%s",nome);

printf("\nDigite o numero da matricula: \n");

scanf("%s",matricula);

printf("\nDigite a turma: \n");

scanf("%s",turma);

printf("\nDigite a 1ª nota do aluno: \n");

scanf("%f",&p1);

printf("\nDigite a 2ª nota do aluno: \n");

scanf("%f",&p2);

printf("\nDigite a 3ª nota do aluno: \n");

scanf("%f",&p3);

turmas=preenche(turmas,nome,matricula,turma,p1,p2,p3);

break;}

 

case 3: {printf("\nDigite o numero da matricula para excluir o aluno da lista\n");

scanf("%s",&apagar);

remove(turmas,apagar);

break;}

 

case 4: {printf("\nDigite a nota de corte: ");

scanf("%s",&medias);

imprime(turmas,medias);

break;}

 

case 5: {printf("Opcao 5");

break;}

case 6: {printf("\nSaindo...");

break;

}

 

default:{printf("\nOpcao invalida\n");}

}

}

getch();

return(0);

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está na função de preenchimento.

Veja que sempre o último valor inserido aponta para próximo NULL.

 

Lista* preenche(Lista* turmas,char nome[81], char matricula[8], char turma[20], float p1, float p2, float p3)
{
turmas=NULL; // aqui está o problema, remova essa linha
Lista* novo=(Lista*) malloc(sizeof(Lista)); //Função que Preenche a lista
strcpy(novo->nome, nome);
strcpy(novo->matricula, matricula);
strcpy(novo->turma, turma);
novo->p1=p1;
novo->p2=p2;
novo->p3=p3;
novo->prox=turmas;
return novo;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.