CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo XI Noções de Estruturas de Dados.

Post on 17-Apr-2015

109 views 0 download

Transcript of CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo XI Noções de Estruturas de Dados.

CES-10 INTRODUÇÃO CES-10 INTRODUÇÃO À COMPUTAÇÃOÀ COMPUTAÇÃO

Capítulo XI Capítulo XI

Noções de Estruturas de Noções de Estruturas de DadosDados

Capítulo XI – Noções de Capítulo XI – Noções de Estruturas de DadosEstruturas de Dados

11.1 – Importância de uma boa 11.1 – Importância de uma boa estruturação de informaçõesestruturação de informações

11.2 – Modelos de armazenamento de 11.2 – Modelos de armazenamento de informaçõesinformações

11.3 – Listas lineares encadeadas11.3 – Listas lineares encadeadas

11.4 – Pilhas e filas11.4 – Pilhas e filas

11.5 – Árvores11.5 – Árvores

11.1 – Importância de uma 11.1 – Importância de uma Boa Estruturação de Boa Estruturação de

InformaçõesInformações Os Os sistemas computacionaissistemas computacionais da atualidade da atualidade

têm capacidade de têm capacidade de armazenararmazenar e e manipularmanipular em altíssima velocidade quantidades imensas em altíssima velocidade quantidades imensas de de informações informações

Das mais diversas Das mais diversas espécies espécies

Para as mais variadas Para as mais variadas aplicações aplicações

Localizadas espalhadamente Localizadas espalhadamente pelo planetapelo planeta

Exemplos de informações: Exemplos de informações:

Medições colhidas em experiências Medições colhidas em experiências científicascientíficas, , sondagens e análise de sondagens e análise de fenômenosfenômenos físicos e físicos e químicosquímicos

Medições colhidas durante Medições colhidas durante cirurgiascirurgias e e informações para informações para diagnoses médicasdiagnoses médicas

Controle de Controle de materiaismateriais e e produtosprodutos na indústria e na indústria e comérciocomércio

OrganogramasOrganogramas e controle de pessoal em e controle de pessoal em empresasempresas

Organização de sistemas Organização de sistemas bancários bancários e de e de bibliotecasbibliotecas

Exemplos de informações:Exemplos de informações:

Confecção e acompanhamento de Confecção e acompanhamento de projetosprojetos

SimulaçãoSimulação de fenômenos físicos, químicos, de fenômenos físicos, químicos, biológicos, psíquicos e sociaisbiológicos, psíquicos e sociais

Cursos, livros e apostilasCursos, livros e apostilas

Jogos, artes, etc.Jogos, artes, etc.

Importância do tempo gasto pelo Importância do tempo gasto pelo computador:computador:

TempoTempo de máquina pode ficar caro (aluguel) de máquina pode ficar caro (aluguel)

CustoCusto proporcional ao proporcional ao tempotempo de utilização de utilização

A A respostaresposta do computador deve ser dada em do computador deve ser dada em tempo hábiltempo hábil

Previsão de Previsão de catástrofes atmosféricascatástrofes atmosféricas

Sistemas computacionais em Sistemas computacionais em tempo realtempo real

Tarefas consumidoras de tempo e memória:Tarefas consumidoras de tempo e memória:

OrdenaçãoOrdenação, , classificaçãoclassificação e e pesquisapesquisa de de informaçõesinformações

LigaçãoLigação entre informações entre informações correlatascorrelatas

InserçãoInserção, , eliminaçãoeliminação e e atualizaçãoatualização de de informaçõesinformações

CompactaçãoCompactação e descompactação de e descompactação de informaçõesinformações

CálculosCálculos matemático-científicos envolvendo matemático-científicos envolvendo imensas matrizes imensas matrizes multidimensionais, etc.multidimensionais, etc.

Crítico:Crítico: quando o quando o universouniverso de informações é de informações é muito muito grandegrande

Eficiente utilização de Eficiente utilização de recursos recursos computacionaiscomputacionais e redução do e redução do tempo de tempo de respostaresposta dependem de dependem de

Boa Boa estruturaçãoestruturação das informações das informações Bons Bons algoritmosalgoritmos para manipulá-las para manipulá-las

Tudo depende da Tudo depende da naturezanatureza das informações e das informações e das das aplicaçõesaplicações

Capítulo XI – Noções de Capítulo XI – Noções de Estruturas de DadosEstruturas de Dados

11.1 – Importância de boa 11.1 – Importância de boa estruturação de informaçõesestruturação de informações

11.2 – Modelos de armazenamento de 11.2 – Modelos de armazenamento de informaçõesinformações

11.3 – Listas lineares encadeadas11.3 – Listas lineares encadeadas

11.4 – Pilhas e filas11.4 – Pilhas e filas

11.5 – Árvores11.5 – Árvores

11.2 – Modelos de 11.2 – Modelos de Armazenamento de Armazenamento de

InformaçõesInformações Há vários Há vários modelosmodelos para visualizar, interpretar e para visualizar, interpretar e

armazenar sistemas de armazenar sistemas de informaçõesinformações

Exemplos:Exemplos:

Listas lineares, Árvores, GrafosListas lineares, Árvores, Grafos

Cada um desses Cada um desses modelosmodelos pode ser implementado pode ser implementado por meio de diversas por meio de diversas estruturas de dadosestruturas de dados alternativasalternativas

A A escolhaescolha de uma de uma estruturaestrutura para um para um modelomodelo, , numa determinada aplicação, afeta a numa determinada aplicação, afeta a eficiênciaeficiência do do programaprograma

11.2.1 – Listas lineares11.2.1 – Listas lineares

Os Os elementoselementos formam uma formam uma sequência linearsequência linear

Cada Cada elementoelemento tem um tem um antecessorantecessor e um e um sucessorsucessor (exceto o primeiro e o último) (exceto o primeiro e o último)

TabelasTabelas em geral podem se enquadrar nesse em geral podem se enquadrar nesse modelomodelo

• Listas telefônicas• Folhas de

pagamento de empregados• Livros de uma

biblioteca• Tabelas de banco

de dados relacional

Cada elemento ocupa uma linha da tabela

11.2.2 – Árvores 11.2.2 – Árvores

Os Os elementoselementos formam uma formam uma hierarquia hierarquia paternapaterna

Cada Cada elementoelemento tem tem um e apenas um pai um e apenas um pai (exceto a raiz)(exceto a raiz)

Cada elemento tem Cada elemento tem zero ou mais filhoszero ou mais filhos

Um Um elementoelemento não pode ter um não pode ter um ancestralancestral como como filhofilho

Exemplos:Exemplos:

Organogramas de empresasOrganogramas de empresas Organização de livros e cursosOrganização de livros e cursos Jogos eliminatórios de um campeonatoJogos eliminatórios de um campeonato Expressões aritméticasExpressões aritméticas Estrutura de um programaEstrutura de um programa

Expressão aritmética:Expressão aritmética:

void main () {void main () {int n, i, p, aux, vetor[50]; int n, i, p, aux, vetor[50]; char trocou;char trocou;read (n);read (n);for (i=0; i<n; i++)for (i=0; i<n; i++)

read (vetor[i]);read (vetor[i]);trocou = 1;trocou = 1;for (p = n-2; p>=0 && trocou == 1; p--) {for (p = n-2; p>=0 && trocou == 1; p--) {

trocou = 0; trocou = 0; for (i = 0; i<=p; i++)for (i = 0; i<=p; i++)

if (vetor[i] > vetor[i+1]) {if (vetor[i] > vetor[i+1]) {aux = vetor[i]; aux = vetor[i]; vetor[i] = vetor[i+1];vetor[i] = vetor[i+1];vetor[i+1] = aux; vetor[i+1] = aux; trocou = 1;trocou = 1;

}}}}for (i=0; i<n; i++) for (i=0; i<n; i++)

write (vetor[i]);write (vetor[i]);}}

Sua árvore de armazenamento

Estrutura de um programa em C aplainada

Cada nó retangular pode ser mais detalhado

11.2.3 – Grafos 11.2.3 – Grafos

Os Os elementoselementos se interligam de forma bem se interligam de forma bem geralgeral, sem necessariamente formar , sem necessariamente formar hierarquiashierarquias ou ou sequênciassequências

Exemplos:Exemplos:

Tarefas de um projetoTarefas de um projeto Sistema rodoviário de uma regiãoSistema rodoviário de uma região Rede de computadoresRede de computadores Fornecimento de produtos entre fábricasFornecimento de produtos entre fábricas Dependências entre os comandos de um Dependências entre os comandos de um

programaprograma Máquinas de estados finitos (inúmeras Máquinas de estados finitos (inúmeras

aplicações em Engenharia)aplicações em Engenharia) Editores de textoEditores de texto

Capítulo XI – Noções de Capítulo XI – Noções de Estruturas de DadosEstruturas de Dados

11.1 – Importância de boa 11.1 – Importância de boa estruturação de informaçõesestruturação de informações

11.2 – Modelos de armazenamento de 11.2 – Modelos de armazenamento de informaçõesinformações

11.3 – Listas lineares encadeadas11.3 – Listas lineares encadeadas

11.4 – Pilhas e filas11.4 – Pilhas e filas

11.5 – Árvores11.5 – Árvores

11.3 – Listas Lineares 11.3 – Listas Lineares EncadeadasEncadeadas

11.3.1 – Conceito de lista linear geral11.3.1 – Conceito de lista linear geral

Listas lineares geraisListas lineares gerais são listas lineares que são listas lineares que admitem admitem inserção e remoçãoinserção e remoção de elementos de elementos em em qualquer posiçãoqualquer posição

As As estruturas de dadosestruturas de dados para elas se dividem para elas se dividem em dois grandes grupos:em dois grandes grupos:

Estruturas contíguas:Estruturas contíguas: seus elementos são seus elementos são armazenados num armazenados num vetorvetor

Estruturas encadeadas:Estruturas encadeadas: seus elementos são seus elementos são guardados em guardados em encadeamentos de estruturasencadeamentos de estruturas

11.3.2 – Estruturas contíguas11.3.2 – Estruturas contíguas

Os Os elementoselementos são armazenados num são armazenados num vetorvetor::

Declarações, supondo que os elementos sejam nomes de até 15 caracteres:

typedef char nome[16];typedef nome vetor[51];typedef struct lista lista;struct lista {

vetor Elementos; int ultimo;

};lista L;

11.3.2 – Estruturas contíguas11.3.2 – Estruturas contíguas

Os Os elementoselementos são armazenados num são armazenados num vetorvetor::

Por convenção, o 1º elemento fica guardado na posição 1 do vetor Elementos

Caso o valor do campo ultimo seja zero, a lista está vazia

Caso seja 1, a lista tem apenas um elemento

11.3.2 – Estruturas contíguas11.3.2 – Estruturas contíguas

Os Os elementoselementos são armazenados num são armazenados num vetorvetor::

Inserir um elemento na posição i:

Somar 1 ao campo ultimo

Deslocar os elementos a partir da posição i, uma posição para baixo

Copiar, nessa posição, o elemento a ser inserido

11.3.2 – Estruturas contíguas11.3.2 – Estruturas contíguas

Os Os elementoselementos são armazenados num são armazenados num vetorvetor::

Remover o elemento da posição i:

Subtrair 1 do campo ultimo

Deslocar os elementos a partir da posição i+1, uma posição para cima

O elemento da posição i+1 passa a ocupar a posição i, apagando o que ali estava

Para listas com muitos elementos, inserir e remover das posições iniciais envolvem grande movimentação de informações

A ineficiência será grande

O tamanho das listas fica limitado à dimensão declarada do vetor

Para aplicações com muitas inserções e remoções, a estrutura contígua se mostra inadequada

11.3.3 – Estruturas encadeadas11.3.3 – Estruturas encadeadas

Os Os elementoselementos são guardados em são guardados em encadeamentosencadeamentos de de estruturasestruturas::

Cada Cada estruturaestrutura costuma receber o nome de costuma receber o nome de nónó

Cada Cada nónó guarda um guarda um elementoelemento da lista e um da lista e um ponteiroponteiro apontando para o nó que contém o apontando para o nó que contém o sucessorsucessor desse elemento desse elemento

Por convenção, o Por convenção, o 1º nó1º nó do encadeamento do encadeamento não não guarda nenhum elementoguarda nenhum elemento, para facilitar a , para facilitar a programação de diversas operações com listasprogramação de diversas operações com listas

Esse Esse nó especialnó especial costuma receber a costuma receber a designação de designação de nó-lídernó-líder

Declarações:Declarações:typedef char nome[16];typedef struct noh noh;typedef noh *lista;struct noh {

nome elem; noh *prox;};lista L;

Um ponteiro para o nó-líder identifica perfeitamente a listaO tipo do campo elem poderia ser uma estrutura complexa

Variáveis do tipo posição:Variáveis do tipo posição:

Servem para indicar a posição de um determinado elemento numa lista e também para percorrer listas

Na estrutura contígua, a posição de um elemento pode ser o índice do elemento dentro do vetor

typedef int posicao;

posicao p;

Variáveis do tipo posição:Variáveis do tipo posição:

Na Na estrutura encadeadaestrutura encadeada::

Adota-se uma Adota-se uma convenção não muito naturalconvenção não muito natural, , mas útil para facilitar a mas útil para facilitar a programaçãoprogramação das das operações de operações de inseririnserir e e removerremover elementos da elementos da listalista

Variáveis do tipo posição:Variáveis do tipo posição:

Na Na estrutura encadeadaestrutura encadeada::

PosiçãoPosição de um elemento é um de um elemento é um ponteiroponteiro para o para o nó que contém o nó que contém o antecessorantecessor desse elemento desse elemento

typedef noh *posicao;

posicao p;

Exemplos:Exemplos:

Posição do 2º elemento:Posição do 2º elemento: ponteiro para o nó do ponteiro para o nó do 1º elemento1º elemento

Posição do 1º elemento:Posição do 1º elemento: ponteiro para o ponteiro para o nó-nó-líderlíder

Posição do último elemento:Posição do último elemento: ponteiro para o ponteiro para o penúltimopenúltimo nó nó

typedef noh *posicao;posicao p;

pp p

Fim de lista:Fim de lista:

Posição logo após à do último elemento

Na estrutura contígua, é o índice no vetor após o do último elemento

Fim de lista:Fim de lista:

Na Na estrutura encadeadaestrutura encadeada::

Ponteiro para o último nóPonteiro para o último nó

Fim (L)

Exemplo: formação de uma nova lista:Exemplo: formação de uma nova lista:

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <conio.h>#include <conio.h>

typedef struct noh noh;typedef struct noh noh;

typedef noh *lista;typedef noh *lista;

typedef noh *posicao;typedef noh *posicao;

struct noh {struct noh {

int elem;int elem;

noh *prox;noh *prox;

};};

lista NovaLista (void);lista NovaLista (void);

void EscreverLista (lista);void EscreverLista (lista);

Função para formar uma nova lista, retornando-aFunção para escrever a lista-argumento

Os elementos da lista serão números inteiros;

Poderiam ser complexas estruturas ou ponteiros para elas

void main () {void main () {

lista L;lista L;

printf ("Leitura de uma lista:\n\n");printf ("Leitura de uma lista:\n\n");

L = NovaLista ();L = NovaLista ();

printf ("\nConfirmacao:");printf ("\nConfirmacao:");

EscreverLista (L);EscreverLista (L);

printf("\n\nDigite algo para encerrar: ");printf("\n\nDigite algo para encerrar: ");

getch ();getch ();

}}

L main

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

i

p

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

i

p

3

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

i

p

3

##

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (for (p = L, i = 1p = L, i = 1; i <= n; i++) {; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

i

p

3

##

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (for (p = L, i = 1p = L, i = 1; i <= n; i++) {; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

1i

p

3

##

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

1i

p

3

##

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

1i

p

3

##

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

1i

p

3

##

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

1i

p

3

##

2

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; for (p = L, i = 1; i <= n; i++i++) {) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

1i

p

3

##

2

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; for (p = L, i = 1; i <= n; i++i++) {) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

2i

p

3

##

2

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

2i

p

3

##

2

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

2i

p

3

##

2

p

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

2i

3

##

2

p

5

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; for (p = L, i = 1; i <= n; i++i++) {) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

2i

3

##

2

p

5

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; for (p = L, i = 1; i <= n; i++i++) {) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

3i

3

##

2

p

5

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

3i

3

##

2

p

5

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

3i

3

##

2

p

5

p

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

3i

3

##

2 5

p

7

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; for (p = L, i = 1; i <= n; i++i++) {) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

3i

3

##

2 5

p

7

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; for (p = L, i = 1; i <= n; i++i++) {) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

4i

3

##

2 5

p

7

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

4i

3

##

2 5

p

7

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

NovaLista

L

n

4i

3

##

2 5

p

7

Retorno

Nova lista sai do ar !!!

lista NovaLista () {lista NovaLista () {

lista L; posicao p;lista L; posicao p;

int i, n;int i, n;

printf ("Numero de elementos da lista: ");printf ("Numero de elementos da lista: ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\nElementos:\n\t");printf ("\nElementos:\n\t");

L = (noh *) malloc (sizeof (noh));L = (noh *) malloc (sizeof (noh));

for (p = L, i = 1; i <= n; i++) {for (p = L, i = 1; i <= n; i++) {

p->prox = (noh *) malloc (sizeof (noh));p->prox = (noh *) malloc (sizeof (noh));

p = p->prox;p = p->prox;

scanf ("%d", &p->elem);scanf ("%d", &p->elem);

}}

p->prox = NULL;p->prox = NULL;

return L;return L;

}}

L mainmain: L = NovaLista ();

##

2 5 7

Retorno

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

p

Vídeo

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (for (p = L;p = L; p->prox != NULL; p = p->prox) p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

p

Vídeo

p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

Vídeo

p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2

Vídeo

p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; for (p = L; p->prox != NULL; p = p->proxp = p->prox))

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2

Vídeo

p p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2

Vídeo

p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2 5

Vídeo

p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; for (p = L; p->prox != NULL; p = p->proxp = p->prox))

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2 5

Vídeo

p p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2 5

Vídeo

p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2 5 7

Vídeo

p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; for (p = L; p->prox != NULL; p = p->proxp = p->prox))

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2 5 7

Vídeo

p p

void EscreverLista (lista L) {void EscreverLista (lista L) {

posicao p;posicao p;

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

for (p = L; p->prox != NULL; p = p->prox)for (p = L; p->prox != NULL; p = p->prox)

printf ("%4d", p->prox->elem);printf ("%4d", p->prox->elem);

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

}}

L mainmain: EscreverLista (L);

##

2 5 7

EscreverLista

L

2 5 7

Vídeo

p

Fim !!!

Para Para inseririnserir ou ou removerremover elementos de uma elementos de uma lista linear com estrutura lista linear com estrutura encadeadaencadeada não é não é necessária grande necessária grande movimentaçãomovimentação de dados de dados

Exemplo:Exemplo: inseririnserir um elemento um elemento xx na posição na posição pp de uma lista de uma lista LL

##

2 5 7L

p

O nó do elemento deve ser encadeado aqui

9 x

Passos:

q = p->prox;p->prox = (noh*) malloc (sizeof (noh));p->prox->elem = x;p->prox->prox = q;

q9

Cuidado: p pode apontar para nó fora da lista L

Exemplo:Exemplo: removerremover o elemento da posição o elemento da posição pp de de uma lista uma lista LL

Outra vantagemOutra vantagem da lista encadeada: o da lista encadeada: o número número de elementosde elementos de uma lista não fica limitado a de uma lista não fica limitado a nenhum nenhum dimensionamentodimensionamento estabelecido em estabelecido em declaraçõesdeclarações

p

Nó que contém o elemento da posição p

Passos:

q = p->prox;p->prox = q->prox;free(q);

q

##

2 5 7L 9

Cuidado: p pode apontar para nó fora da lista L