Вы находитесь на странице: 1из 16

Listas Encadeadas

Profa. Karla de Souza

Disciplina IF62A

http://www.dainf.ct.utfpr.edu.br/~karla/

Listas Sequenciais

Chamamos de lista sequencial um conjunto de elementos contguos na memria. Um vetor o melhor exemplo de lista sequencial. O elemento i precedido pelo elemento (i -1) e seguido pelo elemento (i +1).

Como os elementos so contguos, para se acessar um elemento s necessrio o seu ndice, pois o ndice indica tambm o deslocamento a partir do incio, onde se encontra o elemento.

Listas Sequenciais

A vantagem o acesso direto a qualquer dos elementos da lista. A desvantagem que para inserir ou remover elementos, temos que deslocar muitos outros elementos.
...
i-1 i i+1

...

Inserir Remover

Listas Ligadas

Chamamos de lista ligada um conjunto de elementos onde cada elemento indica qual o prximo. No existe contiguidade entre os elementos. Elementos vizinhos podem estar em posies fsicas bem distintas. um conjunto de itens, onde cada elemento contm uma informao e um ponteiro para o prximo item.

...

...

Listas Ligadas

A vantagem a flexibilidade na insero e remoo de elementos. A desvantagem que no temos acesso direto aos elementos. No existe algo equivalente ao ndice para se acessar diretamente o elemento.

Possui tambm um ponteiro para o seu incio e o ponteiro do ltimo elemento tem um valor especial (NULL).
P (inicio)

Listas Ligadas

O campo de informao pode conter qualquer tipo ou conjunto de tipos de elementos.

O ponteiro para o prximo item um ponteiro para um item do mesmo tipo.

Listas Ligadas

Exemplos:

a) campo de informao = int: struct item { int info; struct item *prox; }

b) campo de informao = 2 ints e 1 double:


struct novoitem { int i, j; double a; struct novoitem *prox; }

Listas Ligadas
c) campo de informao = vetor de char:
struct no { char s[30]; struct no *prox }

d) campo de informao = struct com 2 ints e 1 double:


struct info { int i, j; double a; } struct novono { struct info x; struct novono *prox; }

Listas Ligadas

Observe que a definio do tipo de um elemento de uma lista recursiva. Veja no primeiro exemplo: usamos na definio de struct item o prprio struct item. O compilador C permite.
struct item { int info; struct item *prox; }

Listas Ligadas

Uma outra maneira de fazer a mesma definio usar o typedef que apenas um modo de atribuirmos um sinnimo (em geral um nome mais simples) a um tipo (em geral mais complexo) na linguagem C. Fica um pouco mais elegante.

// cria sinomimo para um ponteiro para struct item typedef struct item* link; // declara a struct item struct item { int info; link prox; } // declara um ponteiro para um elemento link p;

Listas Ligadas

Criando uma lista com um nodo, usando a declarao feita para link:

// criar um lista apontada por p com o primeiro elemento p = (link) malloc (sizeof(struct item)); p->info = 99; p->prox = NULL;

99

Exemplo

No programa a seguir a criao e manipulao de uma lista encadeada com a estrutura:

typedef struct Elemento {

char char char char char

nome [100]; rua [100]; cidade [100]; estado [2]; cep [10];

// Apontador para o prximo. Elemento* proximo; };

#include <stdio.h> #include <stdlib.h> // Define a estrutura elemento typedef struct Elemento { char char char char char nome [100]; rua [100]; cidade [100]; estado [2]; cep [10];

// Lao para a escolha do menu. do { // Ajusta tela system ( "cls" ); printf("\n \t \t PROGRAMA LISTA ENCADEADA \n\n\n"); // Chama a funo menu. escolha = menu(); // Seleciona o que fazer com a escolha. switch (escolha) { case 'c' : case 'C' : cadastra(); break; case 'm' : case 'M' : mostra(); break; case 't' : case 'T' : limpaLista(); break; default : printf ( "Opcao invalida. \n" ); } }while((escolha != 'T') && (escolha != 't')); system ( "Pause" ); return 0; }

// Apontador para o prximo. Elemento* proximo; }; // Variveis globais. Elemento *primeiro; Elemento *ultimo; // Funo Principal. int main() { // Declarao de variveis locais. char escolha; // Declarao de funes. char menu(); void inicia_lista(); void cadastra(); void mostra(); void limpaLista();

// Funo que cadastra um novo elemento. void cadastra() { // Declarao de variveis. Elemento* novo; // Novo elemento.
// Ajusta tela system ( "cls" ); printf ( " \t \t CADASTRAMENTO \n \n" ); // Aloca espao para o novo elemento. novo =(Elemento *)malloc(sizeof (Elemento)); novo->proximo = NULL; // Faz a leitura de dados. printf ( "Nome: " ); gets (novo->nome); printf ( "Endereco: " ); gets (novo->rua); printf ( "Cidade: " ); gets (novo->cidade); printf ( "Estado: " ); gets (novo->estado); printf ( "CEP: " ); gets (novo->cep); // Se a lista est vazia, este o primeiro. // Seno, este o novo ultimo. if (primeiro == NULL) { primeiro = novo; ultimo = primeiro; } else { ultimo->proximo = novo; ultimo = novo; } }

// Funo que mostra elementos cadastrados. void mostra() { // Declarao de variveis. Elemento* aux; // Ajusta tela system ( "cls" ); printf ( "\n \t \t ELEMENTOS CADASTRADOS \n \n" ); aux = primeiro; // Exibe todos os elementos. while (aux != NULL) { printf ("%s \n", aux->nome); printf ("%s \n", aux->rua); printf ("%s\n", aux->cidade); printf ("%c%c \n", aux->estado[0], aux->estado[1]); printf ("%s \n", aux->cep); printf ("\n"); aux = aux->proximo; } // Espera ordem para voltar. printf("Digite <ENTER> para continuar..."); getchar(); return; }

// Funo que limpa a lista. void limpaLista () { // Declarao de variveis. Elemento* aux; // Pega o primeiro da lista. aux = primeiro; // Percorre toda a lista. while (aux != NULL) { // Faz prximo ser primeiro primeiro = primeiro->proximo; // Libera o primeiro. free(aux); // Pega novo primeiro elemento. aux = primeiro; } return; } printf ("MENU DE OPCOES \n\n"); printf ("(C)adastrar \n" ); printf ("(M)ostrar \n" ); printf ("(T)erminar \n" ); printf("\nDigite a opcao desejada: "); scanf ("%c", &opcao); fflush (stdin); return opcao; } // Funo menu. char menu() { //printf ("\n \n \n"); char opcao;

Exerccios
Adicionar a opo de encontrar os dados de um elemento da lista dado o valor do campo nome. Adicionar a opo que permita eliminar um elemento da lista dado o valor do campo nome. Adicionar as opes de salvar e ler a lista de um arquivo. Elaborar uma soluo que imprima a lista de elementos de trs para frente.

Вам также может понравиться