Ir para conteúdo

POWERED BY:

Arquivado

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

Alan Correa FACOS

[Resolvido] Lista Encadeada

Recommended Posts

Pessoal...to com problemas para apagar o ultimo registro de uma lista..a função apaga fim. alguem pode me ajudar?


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

typedef struct NOTAS
{
char nome[30];
float nota1;
float nota2;
float nota3;
float media;
int nIndice;
struct NOTAS *prox; //Ponteiro para o proximo
} Aluno;

Aluno *pstLista=NULL; //criei ponteiro para lista, esse ponteiro é Global. Apontando para lugar nenhum.
//criar uma função chamada getnode (PegaNodo), Função que o seu retorno um ponteiro.
Aluno *GetNode();
void FreeNode(Aluno *p);
void Insert();
void PrintLista();
void ApagaInicio();
void ApagaFim();

int main()
{
   Insert();
   Insert();
   Insert();

   PrintLista();
   printf("\n\n--------------------------------------------------------\n\n");
   ApagaInicio();
   PrintLista();
   printf("\n\n---------------------------------------------------------\n\n");
   ApagaFim();
   PrintLista();

   fflush(stdin);
   getchar();
}

Aluno *GetNode()
{
 return (Aluno *) calloc(1,sizeof(Aluno));
}

void FreeNode(Aluno *p)
{
free(p);
}

void Insert()
{
Aluno *temp,*p;    

temp = GetNode();
printf("Digite o nome: ");
fflush(stdin);
gets(temp->nome);
printf("Digite a nota 1: ");
fflush(stdin);
scanf("%f",&temp->nota1);
 printf("Digite a nota 2: ");
fflush(stdin);
scanf("%f",&temp->nota2);
 printf("Digite a nota 3: ");
fflush(stdin);
scanf("%f",&temp->nota3);

temp->media=((temp->nota1+temp->nota2+temp->nota3)/3);
if(pstLista == NULL)
  pstLista = temp;
else {
  for(p=pstLista;p->prox;p=p->prox);
  p->prox = temp;
}
}

void PrintLista()
{
Aluno *p = pstLista;

while(p != NULL) {
   printf("\n%s",p->nome);
   printf("\nNota 1: %.2f",p->nota1);
   printf("\nNota 2: %.2f",p->nota2);
   printf("\nNota 3: %.2f",p->nota3);
   printf("\nMedia: %.2f",p->media);
   p=p->prox;     
} 
}

void ApagaInicio()
{
    Aluno *p = pstLista;

    pstLista=p->prox;
    FreeNode(p);
}
void ApagaFim()
{
    Aluno *p =pstLista;
    for(p=pstLista;p->prox;p=p->prox);
    FreeNode(p);
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, O erro estava na função ApagaFim(), na hora de liberar o ponteiro corretamente. Ok. Mas agora estou com um problema que diz que há um erro de link para referencia na FreeNode. Não consegui corrigir. Vcss tem alguma ideia?

segue o código corrigido:

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

typedef struct NOTAS
{
char nome[30];
float nota1;
float nota2;
float nota3;
float media;
int nIndice;
struct NOTAS *prox; //Ponteiro para o proximo
} EstruturasNotas;

EstruturasNotas *pstLista=NULL; 

/****************************declara funções*/
EstruturasNotas *GetNode();
void FreeNode(EstruturasNotas *p);
void Insert();
void PrintLista();
void ApagaInicio();
void ApagaFim();

/****************************função principal*/
int main()
{
   Insert();
   Insert();
   Insert();

   PrintLista();
   printf("\n\n--------------------------------------------------------\n\n");

   ApagaInicio();
   PrintLista();
   printf("\n\n---------------------------------------------------------\n\n");

   ApagaFim();
   PrintLista();

   fflush(stdin);
   getchar();
}
/****************************cria estrutura na memoria*/
EstruturasNotas *GetNode()
{
 return (EstruturasNotas *) calloc(1,sizeof(EstruturasNotas));
}

void FreeNode(EstruturasNotas *p);

/****************************inserir*/
void Insert()
{
EstruturasNotas *temp,*p;    

temp = GetNode();
printf("Digite o nome: ");
fflush(stdin);
gets(temp->nome);
printf("Digite a nota 1: ");
fflush(stdin);
scanf("%f",&temp->nota1);
 printf("Digite a nota 2: ");
fflush(stdin);
scanf("%f",&temp->nota2);
 printf("Digite a nota 3: ");
fflush(stdin);
scanf("%f",&temp->nota3);

temp->media=((temp->nota1+temp->nota2+temp->nota3)/3);
if(pstLista == NULL)
  pstLista = temp;
else {
  for(p=pstLista;p->prox;p=p->prox);
  p->prox = temp;
}
}

/****************************exibir*/
void PrintLista()
{
EstruturasNotas *p = pstLista;

while(p != NULL) {
   printf("\n%s",p->nome);
   printf("\nNota 1: %.2f",p->nota1);
   printf("\nNota 2: %.2f",p->nota2);
   printf("\nNota 3: %.2f",p->nota3);
   printf("\nMedia: %.2f",p->media);
   p=p->prox;     
} 
}
/****************************apaga inicio*/
void ApagaInicio()
{
    EstruturasNotas *p = pstLista;

    pstLista=p->prox;
    FreeNode(p);
}

/****************************apaga fim*/
void ApagaFim()
{
    EstruturasNotas *p =pstLista;
    for(p=pstLista;p->prox->prox;p=p->prox);
    FreeNode(p->prox);
    p->prox=NULL;
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho algumas sugestões gerais a fazer, que não dizem respeito a listas encadeadas:

 

- não use fflush(stdin). É fácil achar o motivo desta - procure;

- se você sentir a necessidade de representar dados valor semântico similar, considere usar vetores ao invés de criar diversas variáveis (ex.: notax vs. nota[ quantidade ]).

- cuidado com os nomes escolhidos. Uma função que aloca espaço para um nó não deveria chamar "getnode()". Nomes mais descritivos seriam "allocatenode()", "makenode()", etc;

- quando for implementar uma função que não deve receber argumentos, especifique isto explicitamente (diferença entre 'void funcao() {}' e 'void funcao(void) {}'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá pessoal...agora corrigi os erros que não permitiam nem compilar, está funcionando bem o código....mas sou iniciante, e gostaria de dicas para deixar o código mais "enxuto", melhorar organização..agradeço muito a ajuda e as dicas

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

typedef struct NOTAS {

char nome[30];
float nota1;
float nota2;
float nota3;
float media;
int nIndice;
struct NOTAS *prox; //Ponteiro para o proximo
} Aluno;

Aluno *pstLista=NULL;

Aluno *AlocandoStrutura();
void LiberandoEstrutura(Aluno *p);
void Insert();
void PrintLista();
void ApagaInicio();
void ApagaFim();

int main()
{

Insert();
Insert();
Insert();

PrintLista();
printf("\n--------------------------------------------------------\n");
ApagaInicio();
PrintLista();
printf("\n---------------------------------------------------------\n");

ApagaFim();
PrintLista();

fflush(stdin);
getchar();
}
Aluno *AlocandoStrutura()
{
return (Aluno *) calloc(1,sizeof(Aluno));
}
void LiberandoEstrutura(Aluno *p)
{
free(p);
}
void Insert()
{
Aluno *temp,*p;
temp = AlocandoStrutura();
printf("Digite o nome: ");
fflush(stdin);
gets(temp->nome);
printf("Digite a nota 1: ");
fflush(stdin);
scanf("%f",&temp->nota1);
printf("Digite a nota 2: ");
fflush(stdin);
scanf("%f",&temp->nota2);
printf("Digite a nota 3: ");
fflush(stdin);
scanf("%f",&temp->nota3);
temp->media=((temp->nota1+temp->nota2+temp->nota3)/3);
if(pstLista == NULL)
pstLista = temp;
else {
for(p=pstLista;p->prox;p=p->prox);
p->prox = temp;
}
}
void PrintLista()
{
Aluno *p = pstLista;
while(p != NULL) {
printf("%s",p->nome);
printf("\nNota 1: %.2f\n",p->nota1);
printf("Nota 2: %.2f\n",p->nota2);
printf("Nota 3: %.2f\n",p->nota3);
printf("Media: %.2f\n",p->media);
p=p->prox;
}
}

void ApagaInicio()
{
Aluno *p = pstLista;
pstLista=p->prox;
LiberandoEstrutura(p);
}
void ApagaFim()
{
Aluno *p =pstLista;
for(p=pstLista;p->prox->prox;p=p->prox);
LiberandoEstrutura(p->prox);
p->prox = NULL;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Comece por identar corretamente seu código.

 

Também não use fflush(stdin). NUNCA. Nem gets(). Veja na seção de "Artigos e Laboratório de Códigos Fonte", em um tópico destacado, porque não deve usar.

 

Abraços :D

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.