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

Slides:



Advertisements
Apresentações semelhantes
Funções em C.
Advertisements

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS ESTRUTURAS DE DADOS AVANÇADAS Aula /08/2011 Professor Leomir J. Borba-
Listas Encadeadas Circulares Listas Duplamente Encadeadas
2008 LCG/UFRJ. All rights reserved. 1 Standard Template Library STL Claudio Esperança Paulo Roma Cavalcanti.
SISTEMA BINÁRIO Hardware de Computadores. SISTEMA BINÁRIO Hardware de Computadores.
Modelo planetário: errado Elétrons são descritos por meio de funções de onda Mecânica Quântica : probabilidades.
PGF5001 – Mecânica Quântica 1 Prof. Emerson Passos.
Computação: Cursos, Atuação e Interação Profissional Marcos José Santana Departamento de Ciências de Computação e Estatística ICMC-USP - São Carlos.
INTRODUÇÃO À COMPUTAÇÃO PARALELA
Estruturas de Dados para projeto de SGBD. Estruturas de dados analisadas Estruturas de nível Esparso Denso Combinadas Arvore B+ Tabela de hash.
Subconsultas em SQL. Subconsulta Estrutura geral SELECT.... FROM.... WHERE [at] OPERADOR ( SELECT... FROM... [WHERE... ]) Declaração SELECT localizada.
Introdução à Consulta 24/3/06. Categorias de comandos DDL : estruturação de objetos de BD Ex. create table, drop index, alter table... DML: manipulação.
SISTEMAS DE NUMERAÇÃO Material elaborado pelo Prof. José Luiz Mendes e alterado pela Profa Janine.
Sistemas Operacionais
Prof. Dr. Helder Anibal Hermini
(Como implementar multiplicação e divisão uma vez só :-)
Compressão por Hardware
Webcast Gestão da Manutenção Histórico de Aplicações e Manutenções.
Profa. Graziela Santos de Araújo Algoritmos e Programação II, 2010
Introdução A fim de preparar a geração de código, deve-se relacionar o fonte estático do programa às ações em tempo de execução. Durante a execução, o.
UD de Sorocaba/ Iperó UNIVERSIDADE ESTADUAL PAULISTA Recursos Computacionais Antonio Martins.
Campus de Sorocaba UNIVERSIDADE ESTADUAL PAULISTA Recursos Computacionais Antonio Martins.
Sistemas de Tutoria Inteligente (STI) Visam proporcionar instrução de forma adaptada a cada aprendiz. STIs adaptam o processo de instrução a determinadas.
Capitulo 3 Técnicas de Diagnóstico CT-282 Tutores Inteligentes Diego Ajukas.
Adriana da Silva Jacinto CT-282 Prof. Dr.Parente Técnicas de diagnóstico 1º semestre 2005.
CES-11 LAB 03 Bitmap Quadtree
CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica.
Capítulo VII – Tipos Enumerativos e Estruturas 7.1 – Tipos enumerativos 7.2 – A necessidade de estruturas 7.3 – Manipulação dos campos de uma estrutura.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo III Comandos de Controle.
1.3 – Interpretadores – Compiladores versus Interpretadores
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013
CES-10 INTRODUÇÃO À COMPUTAÇÃO
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo VII Variáveis Indexadas Numéricas.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo XI Encadeamento de Estruturas por Ponteiros.
Capítulo IX – Ponteiros 9.1 – Introdução 9.2 – Relação entre ponteiros e variáveis indexadas 9.3 – Alocação dinâmica de memória 9.4 – Variáveis indexadas,
Gerenciamento de Dados Instituto Tecnológico da Aeronáutica – ITA CE-245 Tecnologias da Informação Professor Adilson Marques da Cunha Aluna: Michelle.
Exemplo: ordenação de uma lista pelo Selection-Sort:
1 Definição de Dicionário Dicionário é um sistema de informações: Equivalente a um conjunto de elementos não repetidos Equivalente a um conjunto de elementos.
CES-41 COMPILADORES Capítulo I Introdução.
FUNDAÇÃO CARLOS CHAGAS
MAC 499 Trabalho de Formatura Supervisionado André Takemoto nº USP
ALOCAÇÃO DINÂMICA DE MEMÓRIA
A Importância da Computação Científica Profa. Dra. Marli de Freitas Gomes Hernandez UNIVERSIDADE ESTADUAL DE CAMPINAS CENTRO.
Sistemas Lineares Parte 2
Resolução de Sistemas Lineares- Parte 1
Desempenho A rápida taxa de melhoria na tecnologia de computadores veio em decorrência de dois fatores: avanços na tecnologia utilizada na construção.
Listas Lineares.
Capítulo 1 Introdução 1.1 O que é um sistema operacional
VELOCIDADE DE REAÇÃO 1.A CONCENTRAÇÃO E A VELOCIDADE DE REAÇÃO 2.A VELOCIDADE INSTANTÂNEA DE REAÇÃO 3.AS LEIS DE VELOCIDADE E A ORDEM DE REAÇÃO.
Sistema de Planejamento da Produção
Recursividade Estrutura de Dados.
Marco Antonio Montebello Júnior
Otimização Aplicada ao Dimensionamento e Operação de Reservatórios
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
Curso de Programação em C++
Baseado no documento do Prof. Ronaldo Martins da Costa
LINGUAGENS DE PROGRAMAÇÃO
Baseado no documento do Prof. Ronaldo Martins da Costa
04:27 Introdução Tipos de Fluxo de Dados e de Arquivos Manipulação de Arquivos em Java Classes FileReader e FileWriter Classes FileInputStream e FileOutputStream.
Sistemas de Informação Prof. Me. Everton C. Tetila Modelo de dados relacional Banco de Dados I.
Computação Gráfica Geometria de Transformações
Introdução Ciência da Computação estudo de algoritmos –ÊNFASE ao estudo de DADOS armazenamento manipulação refinamento (a partir de dados cru) estrutura.
APRESENTAÇÃO SISTEMAS INTEGRADOS DE MANUFATURA
Slides: Prof. João Fabro UTFPR - Curitiba
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Árvores Binárias de Pesquisa
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017
Capítulo II – Listas Lineares Gerais
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas
Capítulo IV – Árvores Gerais
Transcrição da apresentação:

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

Capítulo XI – Noções de Estruturas de Dados 11.1 – Importância de uma boa estruturação de informações 11.2 – Modelos de armazenamento de informações 11.3 – Listas lineares encadeadas 11.4 – Pilhas e filas 11.5 – Árvores

11.1 – Importância de uma Boa Estruturação de Informações Os sistemas computacionais da atualidade têm capacidade de armazenar e manipular em altíssima velocidade quantidades imensas de informações Os sistemas computacionais da atualidade têm capacidade de armazenar e manipular em altíssima velocidade quantidades imensas de informações Das mais diversas espécies Das mais diversas espécies Para as mais variadas aplicações Para as mais variadas aplicações Localizadas espalhadamente pelo planeta Localizadas espalhadamente pelo planeta

Exemplos de informações: Medições colhidas em experiências científicas, sondagens e análise de fenômenos físicos e químicos Medições colhidas em experiências científicas, sondagens e análise de fenômenos físicos e químicos Medições colhidas durante cirurgias e informações para diagnoses médicas Medições colhidas durante cirurgias e informações para diagnoses médicas Controle de materiais e produtos na indústria e comércio Controle de materiais e produtos na indústria e comércio Organogramas e controle de pessoal em empresas Organogramas e controle de pessoal em empresas Organização de sistemas bancários e de bibliotecas Organização de sistemas bancários e de bibliotecas

Exemplos de informações: Confecção e acompanhamento de projetos Confecção e acompanhamento de projetos Simulação de fenômenos físicos, químicos, biológicos, psíquicos e sociais Simulação de fenômenos físicos, químicos, biológicos, psíquicos e sociais Cursos, livros e apostilas Cursos, livros e apostilas Jogos, artes, etc. Jogos, artes, etc.

Importância do tempo gasto pelo computador: Tempo de máquina pode ficar caro (aluguel) Tempo de máquina pode ficar caro (aluguel) Custo proporcional ao tempo de utilização Custo proporcional ao tempo de utilização A resposta do computador deve ser dada em tempo hábil A resposta do computador deve ser dada em tempo hábil Previsão de catástrofes atmosféricas Previsão de catástrofes atmosféricas Sistemas computacionais em tempo real Sistemas computacionais em tempo real

Tarefas consumidoras de tempo e memória: Ordenação, classificação e pesquisa de informações Ordenação, classificação e pesquisa de informações Ligação entre informações correlatas Ligação entre informações correlatas Inserção, eliminação e atualização de informações Inserção, eliminação e atualização de informações Compactação e descompactação de informações Compactação e descompactação de informações Cálculos matemático-científicos envolvendo imensas matrizes multidimensionais, etc. Cálculos matemático-científicos envolvendo imensas matrizes multidimensionais, etc.

Crítico: quando o universo de informações é muito grande Crítico: quando o universo de informações é muito grande Eficiente utilização de recursos computacionais e redução do tempo de resposta dependem de Eficiente utilização de recursos computacionais e redução do tempo de resposta dependem de Boa estruturação das informações Boa estruturação das informações Bons algoritmos para manipulá-las Bons algoritmos para manipulá-las Tudo depende da natureza das informações e das aplicações Tudo depende da natureza das informações e das aplicações

Capítulo XI – Noções de Estruturas de Dados 11.1 – Importância de boa estruturação de informações 11.2 – Modelos de armazenamento de informações 11.3 – Listas lineares encadeadas 11.4 – Pilhas e filas 11.5 – Árvores

11.2 – Modelos de Armazenamento de Informações Há vários modelos para visualizar, interpretar e armazenar sistemas de informações Há vários modelos para visualizar, interpretar e armazenar sistemas de informações Exemplos: Exemplos: Listas lineares, Árvores, Grafos Cada um desses modelos pode ser implementado por meio de diversas estruturas de dados alternativas Cada um desses modelos pode ser implementado por meio de diversas estruturas de dados alternativas A escolha de uma estrutura para um modelo, numa determinada aplicação, afeta a eficiência do programa A escolha de uma estrutura para um modelo, numa determinada aplicação, afeta a eficiência do programa

– Listas lineares Os elementos formam uma sequência linear Os elementos formam uma sequência linear Cada elemento tem um antecessor e um sucessor (exceto o primeiro e o último) Cada elemento tem um antecessor e um sucessor (exceto o primeiro e o último)

Tabelas em geral podem se enquadrar nesse modelo Tabelas em geral podem se enquadrar nesse modelo 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

– Árvores Os elementos formam uma hierarquia paterna Os elementos formam uma hierarquia paterna

Cada elemento tem um e apenas um pai (exceto a raiz) Cada elemento tem um e apenas um pai (exceto a raiz) Cada elemento tem zero ou mais filhos Cada elemento tem zero ou mais filhos Um elemento não pode ter um ancestral como filho Um elemento não pode ter um ancestral como filho

Exemplos: Organogramas de empresas Organogramas de empresas Organização de livros e cursos Organização de livros e cursos Jogos eliminatórios de um campeonato Jogos eliminatórios de um campeonato Expressões aritméticas Expressões aritméticas Estrutura de um programa Estrutura de um programa

Expressão aritmética:

void main () { int n, i, p, aux, vetor[50]; char trocou; read (n); for (i=0; i<n; i++) read (vetor[i]); trocou = 1; for (p = n-2; p>=0 && trocou == 1; p--) { trocou = 0; for (i = 0; i<=p; i++) if (vetor[i] > vetor[i+1]) { aux = vetor[i]; vetor[i] = vetor[i+1]; vetor[i+1] = aux; trocou = 1; }} for (i=0; i<n; i++) write (vetor[i]); } Sua árvore de armazenamento Estrutura de um programa em C aplainada

Cada nó retangular pode ser mais detalhado

– Grafos Os elementos se interligam de forma bem geral, sem necessariamente formar hierarquias ou sequências Os elementos se interligam de forma bem geral, sem necessariamente formar hierarquias ou sequências

Exemplos: Tarefas de um projeto Tarefas de um projeto Sistema rodoviário de uma região Sistema rodoviário de uma região Rede de computadores Rede de computadores Fornecimento de produtos entre fábricas Fornecimento de produtos entre fábricas Dependências entre os comandos de um programa Dependências entre os comandos de um programa Máquinas de estados finitos (inúmeras aplicações em Engenharia) Máquinas de estados finitos (inúmeras aplicações em Engenharia) Editores de texto Editores de texto

Capítulo XI – Noções de Estruturas de Dados 11.1 – Importância de boa estruturação de informações 11.2 – Modelos de armazenamento de informações 11.3 – Listas lineares encadeadas 11.4 – Pilhas e filas 11.5 – Árvores

11.3 – Listas Lineares Encadeadas – Conceito de lista linear geral Listas lineares gerais são listas lineares que admitem inserção e remoção de elementos em qualquer posição Listas lineares gerais são listas lineares que admitem inserção e remoção de elementos em qualquer posição As estruturas de dados para elas se dividem em dois grandes grupos: As estruturas de dados para elas se dividem em dois grandes grupos: Estruturas contíguas: seus elementos são armazenados num vetor Estruturas contíguas: seus elementos são armazenados num vetor Estruturas encadeadas: seus elementos são guardados em encadeamentos de estruturas Estruturas encadeadas: seus elementos são guardados em encadeamentos de estruturas

– Estruturas contíguas Os elementos são armazenados num vetor: Os elementos são armazenados num vetor: 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;

– Estruturas contíguas Os elementos são armazenados num vetor: Os elementos são armazenados num vetor: 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

– Estruturas contíguas Os elementos são armazenados num vetor: Os elementos são armazenados num vetor: 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

– Estruturas contíguas Os elementos são armazenados num vetor: Os elementos são armazenados num vetor: 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

– Estruturas encadeadas Os elementos são guardados em encadeamentos de estruturas: Os elementos são guardados em encadeamentos de estruturas: Cada estrutura costuma receber o nome de nó Cada estrutura costuma receber o nome de nó Cada nó guarda um elemento da lista e um ponteiro apontando para o nó que contém o sucessor desse elemento Cada nó guarda um elemento da lista e um ponteiro apontando para o nó que contém o sucessor desse elemento

Por convenção, o 1º nó do encadeamento não guarda nenhum elemento, para facilitar a programação de diversas operações com listas Por convenção, o 1º nó do encadeamento não guarda nenhum elemento, para facilitar a programação de diversas operações com listas Esse nó especial costuma receber a designação de nó-líder Esse nó especial costuma receber a designação de nó-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 lista O tipo do campo elem poderia ser uma estrutura complexa

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: Na estrutura encadeada: Na estrutura encadeada: Adota-se uma convenção não muito natural, mas útil para facilitar a programação das operações de inserir e remover elementos da lista Adota-se uma convenção não muito natural, mas útil para facilitar a programação das operações de inserir e remover elementos da lista

Variáveis do tipo posição: Na estrutura encadeada: Na estrutura encadeada: Posição de um elemento é um ponteiro para o nó que contém o antecessor desse elemento Posição de um elemento é um ponteiro para o nó que contém o antecessor desse elemento typedef noh *posicao; posicao p;

Exemplos: Posição do 2º elemento: ponteiro para o nó do 1º elemento Posição do 2º elemento: ponteiro para o nó do 1º elemento Posição do 1º elemento: ponteiro para o nó-líder Posição do 1º elemento: ponteiro para o nó-líder Posição do último elemento: ponteiro para o penúltimo nó Posição do último elemento: ponteiro para o penúltimo nó typedef noh *posicao; posicao p; pp p

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: Na estrutura encadeada: Na estrutura encadeada: Ponteiro para o último nó Ponteiro para o último nó Fim (L)

Exemplo: formação de uma nova lista: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int elem; noh *prox; }; lista NovaLista (void); void EscreverLista (lista); Função para formar uma nova lista, retornando-a Funçã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 () { lista L; printf ("Leitura de uma lista:\n\n"); L = NovaLista (); printf ("\nConfirmacao:"); EscreverLista (L); printf("\n\nDigite algo para encerrar: "); printf("\n\nDigite algo para encerrar: "); getch (); getch ();} L main

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n i p

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n i p 3

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n i p 3 ##

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n i p 3 ##

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 1 i p 3 ##

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 1 i p 3 ##

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 1 i p 3 ##

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 1 i p 3 ##

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 1 i p 3 ## 2

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 1 i p 3 ## 2

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 2 i p 3 ## 2

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 2 i p 3 ## 2

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 2 i p 3 ## 2 p

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 2 i 3 ## 2 p 5

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 2 i 3 ## 2 p 5

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 3 i 3 ## 2 p 5

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 3 i 3 ## 2 p 5

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 3 i 3 ## 2 p 5 p

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 3 i 3 ## 25 p 7

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 3 i 3 ## 25 p 7

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 4 i 3 ## 25 p 7

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 4 i 3 ## 25 p 7

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); NovaLista L n 4 i 3 ## 25 p 7 Retorno Nova lista sai do ar !!!

lista NovaLista () { lista L; posicao p; int i, n; printf ("Numero de elementos da lista: "); scanf ("%d", &n); printf ("\nElementos:\n\t"); L = (noh *) malloc (sizeof (noh)); L = (noh *) malloc (sizeof (noh)); for (p = L, i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; scanf ("%d", &p->elem); } p->prox = NULL; return L; return L;} L main main: L = NovaLista (); ## 257 Retorno

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L p Vídeo

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L p Vídeo p

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L Vídeo p

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L 2 Vídeo p

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L 2 Vídeo pp

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L 2 Vídeo p

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L 2 5 Vídeo p

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L 2 5 Vídeo pp

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L 2 5 Vídeo p

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L Vídeo p

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L Vídeo pp

void EscreverLista (lista L) { posicao p; printf ("\n\t"); for (p = L; p->prox != NULL; p = p->prox) printf ("%4d", p->prox->elem); printf ("\n"); } L main main: EscreverLista (L); ## 257 EscreverLista L Vídeo p Fim !!!

Para inserir ou remover elementos de uma lista linear com estrutura encadeada não é necessária grande movimentação de dados Para inserir ou remover elementos de uma lista linear com estrutura encadeada não é necessária grande movimentação de dados Exemplo: inserir um elemento x na posição p de uma lista L Exemplo: inserir um elemento x na posição p de uma lista L ##257 L 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; q 9 Cuidado: p pode apontar para nó fora da lista L

Exemplo: remover o elemento da posição p de uma lista L Exemplo: remover o elemento da posição p de uma lista L Outra vantagem da lista encadeada: o número de elementos de uma lista não fica limitado a nenhum dimensionamento estabelecido em declarações Outra vantagem da lista encadeada: o número de elementos de uma lista não fica limitado a nenhum dimensionamento estabelecido em declarações p Nó que contém o elemento da posição p Passos: q = p->prox; p->prox = q->prox; free(q); q ##257 L 9 Cuidado: p pode apontar para nó fora da lista L