Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagem C
Lista Duplamente Encadeada
Projeto com vrios Arquivos.
Slides 22
Prof. Fabiany e Prof. SIMO
ListaEncadeada.h
#ifndef _LISTAENCADEADA_H_
#define _LISTAENCADEADA_H_
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
Minha Lista
primeiro
struct Elemento
{
char nome [100];
char rua [100];
char cidade [100];
char estado [2];
char cep [10];
struct Elemento* proximo;
struct Elemento* anterior;
};
struct elemento
Nome
Rua
Cidade
Estado
CEP
struct Lista
{
struct Elemento*
Elemento* primeiro;
primeiro;
struct Elemento*
Elemento* ultimo;
ultimo;
};
char menu ();
void inicia_lista ();
void cadastra ();
void mostra ();
void mostraReverso ();
void limpaLista ();
#endif
ultimo
ant
NULL
prox
NULL
ListaEncadeada.c
#include "ListaEncadeada.h"
void cadastra()
{ system ( "cls" );
register int i;
MinhaLista.primeiro = NULL;
MinhaLista.ultimo = NULL;
if ( NULL == MinhaLista.primeiro )
{
MinhaLista.primeiro = novo;
MinhaLista.ultimo = MinhaLista.primeiro;
}
else
{
MinhaLista.
MinhaLista.ultimoultimo->proximo = novo;
novo;
novonovo->anterior = MinhaLista.
MinhaLista.ultimo;
ultimo;
MinhaLista.
MinhaLista.ultimo = novo;
novo;
}
fflush ( stdin );
scanf ( "%c", &opcao );
return opcao;
}
ListaEncadeada.c
#include "ListaEncadeada.h"
struct Lista MinhaLista;
Minha Lista
void inicia_lista ()
{
primeiro
MinhaLista.primeiro = NULL;
MinhaLista.ultimo = NULL;
ultimo
NULL
NULL
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
NULL
prox
NULL
void cadastra()
{ system ( "cls" );
register int i;
Minha Lista
primeiro
ultimo
NULL
NULL
novo
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
NULL
prox
NULL
void cadastra()
{
if ( MinhaLista.primeiro == NULL)
{
MinhaLista.primeiro = novo;
MinhaLista.ultimo = MinhaLista.primeiro;
}
else
{
MinhaLista.ultimo->proximo = novo;
novo->anterior = MinhaLista.ultimo;
MinhaLista.ultimo = novo;
}
}
Minha Lista
primeiro
ultimo
struct elemento
Nome
Rua
Cidade
Estado
CEP
novo
ant
NULL
prox
NULL
void cadastra()
{ system ( "cls" );
register int i;
Minha Lista
primeiro
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
prox
NULL
NULL
ultimo
novo
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
NULL
prox
NULL
void cadastra()
{
if ( NULL == MinhaLista.primeiro )
{
MinhaLista.primeiro = novo;
MinhaLista.ultimo = MinhaLista.primeiro;
}
else
{
MinhaLista.ultimo->proximo = novo;
novo->anterior = MinhaLista.ultimo;
MinhaLista.ultimo = novo;
}
}
Minha Lista
primeiro
ultimo
novo
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
NULL
prox
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
prox
NULL
ListaEncadeada.c
#include "ListaEncadeada.h"
void cadastra()
{ system ( "cls" );
register int i;
MinhaLista.primeiro = NULL;
MinhaLista.ultimo = NULL;
if ( NULL == MinhaLista.primeiro )
{
MinhaLista.primeiro = novo;
MinhaLista.ultimo = MinhaLista.primeiro;
}
else
{
MinhaLista.
MinhaLista.ultimoultimo->proximo = novo;
novo;
novonovo->anterior = MinhaLista.
MinhaLista.ultimo;
ultimo;
MinhaLista.
MinhaLista.ultimo = novo;
novo;
}
fflush ( stdin );
scanf ( "%c", &opcao );
return opcao;
}
Minha Lista
primeiro
ultimo
novo
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
NULL
prox
struct elemento
Nome
Rua
Cidade
Estado
CEP
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
ant
prox
prox
NULL
ListaEncadeada.c
void limpaLista ()
{
struct Elemento* aux;
aux = primeiro;
while ( aux != NULL )
{
primeiro = primeiro->proximo;
free ( aux ) ;
aux = primeiro;
}
aux
MinhaLista.primeiro = NULL;
MinhaLista.ultimo = NULL;
Minha Lista
}
primeiro
ultimo
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
NULL
prox
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
prox
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
prox
NULL
ListaEncadeada.c
void mostraReverso()
mostraReverso()
{
void mostra()
{
system ( "cls" );
system ( "cls
" );
"cls"
printf ("\
("\n \n \n");
struct Elemento*
Elemento* aux;
aux;
aux = MinhaLista.primeiro;
aux = MinhaLista.
MinhaLista.ultimo;
ultimo;
);
);
);
);
);
aux = auxaux->anterior;
anterior;
aux = aux->proximo;
}
}
}
);
);
);
);
);
mostraReverso();
aux
Minha Lista
primeiro
ultimo
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
prox
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
prox
NULL
struct elemento
Nome
Rua
Cidade
Estado
CEP
ant
prox
NULL
aux = aux->anterior;
main.c
#include <stdio.h>
#include <stdlib.h>
#include "ListaEncadeada.h"
int main (int argc, char *argv[])
{
char escolha;
inicia_lista ();
for (;;)
{
escolha = menu ();
switch ( escolha )
{
case 'c':
case 'C': { cadastra(); } break;
case 'm':
case 'M': { mostra();
} break;
case 'r
'r':
case 'R
'R': { mostraReverso();
mostraReverso(); } break;
break;
case 't':
case 'T': { limpaLista(); system("Pause"); exit(0); } break;
default : { printf("Opcao invalida. \n");
}
printf ("\n \n \n");
}
system("PAUSE");
return 0;
}
Exerccios
Re-elaborar a soluo anterior sem utilizar variveis ou
ponteiros globais.
Elaborar uma funo para encontrar os dados de um
elemento da lista dado o valor do campo nome.
Elaborar uma funo que permita eliminar um elemento
da lista dado o valor do campo nome.
Elaborar um soluo que permita gravar e recuperar as
informaes da lista em arquivo.