Você está na página 1de 15

Fundamentos de Programao 1

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

Projeto em Dev C++

ListaEncadeada.c
#include "ListaEncadeada.h"

void cadastra()
{ system ( "cls" );
register int i;

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

struct Elemento* novo;


novo = malloc ( 1 * sizeof (struct Elemento) );
novonovo->proximo = NULL;
novonovo->anterior = NULL;

struct Lista MinhaLista;


void inicia_lista ()
{

printf ( "Nome: \n" );


fflush ( stdin );
gets ( novo->nome );

MinhaLista.primeiro = NULL;
MinhaLista.ultimo = NULL;

printf ( "Rua: \n" );


fflush ( stdin ); gets ( novo->rua );

printf ( "Cidade: \n" );


fflush ( stdin ); gets ( novo->cidade );
char menu ()
{
printf ("\n \n \n");
char opcao;

printf ( "Estado: \n" );


fflush ( stdin ); gets ( novo->estado );
printf ( "CEP: \n" );
fflush ( stdin ); gets ( novo->cep );

printf ( "(C)adastrar. \n" );


printf ( "(M)ostrar. \n" );
printf ( " Mostrar (R)eversamente
(R)eversamente.. \n" );
printf ( "(T)erminar. \n" );

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;

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

struct Elemento* novo;


novo = malloc ( 1 * sizeof (struct Elemento) );
novonovo->proximo = NULL;
novonovo->anterior = NULL;

Minha Lista
primeiro

ultimo
NULL

NULL

printf ( "Nome: \n" );


fflush ( stdin );
gets ( novo->nome );
printf ( "Rua: \n" );
fflush ( stdin ); gets ( novo->rua );
printf ( "Cidade: \n" );
fflush ( stdin ); gets ( novo->cidade );
printf ( "Estado: \n" );
fflush ( stdin ); gets ( novo->estado );
printf ( "CEP: \n" );
fflush ( stdin ); gets ( novo->cep );
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;
}
}

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;

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

struct Elemento* novo;


novo = malloc ( 1 * sizeof (struct Elemento) );
novonovo->proximo = NULL;
novonovo->anterior = NULL;

Minha Lista
primeiro

struct elemento
Nome
Rua
Cidade
Estado
CEP

printf ( "Nome: \n" );


fflush ( stdin );
gets ( novo->nome );
printf ( "Rua: \n" );
fflush ( stdin ); gets ( novo->rua );
printf ( "Cidade: \n" );
fflush ( stdin ); gets ( novo->cidade );
printf ( "Estado: \n" );
fflush ( stdin ); gets ( novo->estado );

ant

prox
NULL

NULL

printf ( "CEP: \n" );


fflush ( stdin ); gets ( novo->cep );
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;
}

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;

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

struct Elemento* novo;


novo = malloc ( 1 * sizeof (struct Elemento) );
novonovo->proximo = NULL;
novonovo->anterior = NULL;

struct Lista MinhaLista;


void inicia_lista ()
{

printf ( "Nome: \n" );


fflush ( stdin );
gets ( novo->nome );

MinhaLista.primeiro = NULL;
MinhaLista.ultimo = NULL;

printf ( "Rua: \n" );


fflush ( stdin ); gets ( novo->rua );

printf ( "Cidade: \n" );


fflush ( stdin ); gets ( novo->cidade );
char menu ()
{
printf ("\n \n \n");
char opcao;

printf ( "Estado: \n" );


fflush ( stdin ); gets ( novo->estado );
printf ( "CEP: \n" );
fflush ( stdin ); gets ( novo->cep );

printf ( "(C)adastrar. \n" );


printf ( "(M)ostrar. \n" );
printf ( " Mostrar (R)eversamente
(R)eversamente.. \n" );
printf ( "(T)erminar. \n" );

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;
}

Adicionar mais um elemento na lista:

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");

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

struct Elemento* aux;

struct Elemento*
Elemento* aux;
aux;

aux = MinhaLista.primeiro;

aux = MinhaLista.
MinhaLista.ultimo;
ultimo;

while ( aux != NULL )


{

while ( aux != NULL )


{

printf ( "%s \n", aux->nome


printf ( "%s \n", aux->rua
printf ( "%s \n", aux->cidade
printf ( "%s \n", aux->estado
printf ( "%s \n", aux->cep
printf ( "\n");

printf ( "%s \n", auxaux->nome


printf ( "%s \n", auxaux->rua
printf ( "%s \n", auxaux->cidade
printf ( "%s \n", auxaux->estado
printf ( "%s \n", auxaux->cep
printf ( "\
"\n");

);
);
);
);
);

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.