ces-10 introduÇÃo À computaÇÃo capítulo xi noções de estruturas de dados
TRANSCRIPT
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