Algoritmos e Estruturas de dados

Documentos relacionados
Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

BCC202 - Estrutura de Dados I

Alocação Dinâmica em C

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.

Estrutura de Dados. Aula 07 Alocação Dinâmica

Módulo 5 Vetores e Alocação Dinâmica

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Métodos Computacionais. Tipos Estruturados

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

LINGUAGEM C: ALOCAÇÃO DINÂMICA

INF 1620 P2-01/11/03 Questão 1 Nome:

Linguagem C: Ponteiros - Alocação Dinâmica

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger

Estruturas de Dados Aula 11: TAD Pilha

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Ponteiros e Alocação de Memória

DAS5102 Fundamentos da Estrutura da Informação

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Lista Encadeada (Linked List)

Estrutura de dados 1. Ponteiros

Linguagem C Princípios Básicos (parte 1)

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Curso de Programação C em Ambientes Linux Aula 05

5. Vetores e alocação dinâmica

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

Aula 17: Ponteiros e Alocação Dinâmica em C

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

Ponteiros e Tabelas. K&R: Capítulo 5

Alocação Dinâmica em C

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

INF 1620 P2-23/10/04 Questão 1 Nome:

Carlos Eduardo Batista. Centro de Informática - UFPB

1 Exercícios com ponteiros

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

Transcrição:

Algoritmos e Estruturas de dados Listas Encadeadas Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas) 1 / 21

Definição: Anteriormente estudamos listas encadeadas que foram implementadas como vetores na memória. Aquele tipo de lista assume que os elementos estão sequencialmente na memória do computador. Ou seja, se o elemento 0 do vetor de caracteres está no endereço 1000 o elemento 1 estará no endereço 1001. Existem alguns problemas na implementação que faz uso de vetores: Precisa-se conhecer de antemão a quantidade máxima de elementos; ex: Tipo_Lista elementos [100]; A operação de eliminação não elimina realmente os elementos, ou seja, não libera a memória que estava em uso pelo tal elemento para o SO. (Listas Encadeadas) 2 / 21

Listas como vetores Quando utilizamos vetores, a memória é alocada estaticamente. Ou seja, quando o programa é iniciado toda a memória do vetor é alocada, antes mesmo de as instruções do programa serem executadas. A memória permanece alocada até o programa terminar. 1 typedef struct { 2 int x; 3 float y; 4 double z; 5 } Meu_Tipo ; 6 7 int main ( void ) { 8 Meu_Tipo vetor [10000]; 9. 10. 11 } (Listas Encadeadas) 3 / 21

Listas como vetores Vetores quando utilizados para implementar listas possuem a característica de que os elementos estão sempre numa sequencia. Inicio=0 Fim=2 Quantidade=3 Alocacao sequencial ou estatica Informacao util A Informacao util B Informacao util C [0] [1] [2] (Listas Encadeadas) 4 / 21

Listas como vetores Mas e se desejarmos eliminar um elemento? Inicio=0 Fim=2 Quantidade=3 Informacao util A Antes Alvo Informacao util B Informacao util C [0] [1] [2] Inicio=0 Fim=1 Quantidade=2 Depois Copia conteudo Informacao util A Informacao util C Informacao util C [0] [1] [2] Eliminacao logica do elemento alvo (Listas Encadeadas) 5 / 21

Alocação dinâmica de memória Definição: Chamamos de alocação dinâmica de memória quando o programador deve invocar uma função para obter memória do sistema operacional. malloc - memory allocate. 1 int *x; 2 x = ( int *) malloc (12) ; 3 // Solicitou - se 12 bytes para o SO 4 // Se existe memoria disponivel, 5 // o SO r e t o r n a r o endereco de inicio da memoria 6 // cada inteiro ocupa 4 bytes, logo temos 3 inteiros. 7 x [0]=234; 8 x [1]=123; 9 x [2]=450; (Listas Encadeadas) 6 / 21

Memória internamente 100 101 102 103 104 105.. Programa Livre 300 311 (Listas Encadeadas) 7 / 21

Memória internamente 100 101 102 103 104 105.. x=(int *) malloc (12); Programa Livre 300 311 Alocada (Listas Encadeadas) 8 / 21

Alocação dinâmica de memória No código do slide anterior, digamos que o SO tenha encontrado 12 bytes de memória livre iniciando no endereço 300. Ou seja, seriam os endereços 300,...,311. Nesta situação a função malloc retornará o endereço 300. Precisamos de uma variável ponteiro para armazenar este endereço. No programa em questão, temos int *x que é um ponteiro para inteiro. A função malloc é feita para retornar um endereço qualquer, não somente para variáveis inteiras, mas para floats, double, ou variavéis que o programador tenha definido (typedef e struct). Para transformar o retorno da função malloc() para ser compatível com a variável x usamos o operador cast ou operador de mudança de tipo. x = (int *) malloc (12); (Listas Encadeadas) 9 / 21

Alocação dinâmica de memória Desalocando memória Memória que foi alocada por malloc() e não é mais utilizada pode ser liberada pelo programador C para permitir que o SO faça algum uso desta. Internamente, a cada chamada malloc() o sistema contabiliza o requisito de memória e insere numa tabela de acesso restrito. 1 int *x, *z, *k; 2 3 x = ( int *) malloc (12) ; 4 // vamos assumir que x =20 5 z = ( int *) malloc (120) ; 6 // vamos assumir que y =328 7 k = ( int *) malloc (234) End. Inicial qtd bytes 20 12 328 120 4000 4000 (Listas Encadeadas) 10 / 21

Alocação dinâmica de memória Desalocando memória Para desalocar a memória, utilizamos free(endereco_inicial). 1 int *x, *z, *k; 2 3 x = ( int *) malloc (12) ; 4 // vamos assumir que x =20 5 z = ( int *) malloc (120) ; 6 // vamos assumir que y =328 7 k = ( int *) malloc (234) ; 8 // vamos assumir que k =4000 9 free (z); // libera 120 bytes (Listas Encadeadas) 11 / 21

Alocação dinâmica de memória Descobrindo o tamanho de alguma variável Podemos descobrir o tamanho de alguma variável utilizando a função sizeof(). Assim sendo: 1 typedef struct { 2 int CPF ; // 32 bits ou 4 bytes 3 char nome [20]; // 20 bytes 4 } Tipo_Pilha ; // total : 24 bytes 5 int x; 6 x= sizeof ( int ); // 4 bytes 7 x= sizeof ( int ) *12; // 48 bytes 8 x= sizeof ( Tipo_Pilha ); // 24 bytes Note que sizeof() deve ser utilizando com os tipos de variáveis e não com o nome delas. Ou seja, posso obter o sizeof(int) mas (Listas Encadeadas) 12 / 21

Alocação dinâmica de memória Descobrindo o tamanho de alguma variável Veja o exemplo 1 typedef struct { 2 int CPF ; // 32 bits ou 4 bytes 3 int idade ; // 4 bytes 4 } Tipo_Pilha ; // total : 8 bytes 5 6 Tipo_Pilha * vetor ; 7 vetor =( Tipo_ Pilha *) malloc ( 100* sizeof ( Tipo_Pilha )); 8 if ( vetor!= NULL ) { // Obteve a memoria 9 10 vetor [0]. CPF =123; 11 vetor [0]. idade =23; 12 13 vetor [1]. CPF =456; (Listas Encadeadas) 13 / 21

Criando uma lista struct tipo_l { int valor; struct tipo_l proximo; }; valor proximo valor proximo valor proximo (Listas Encadeadas) 14 / 21

Criando uma lista inicio Quantidade typedef struct { struct tipo_l inicio; int quantidade; } struct tipo_l { int valor; struct tipo_l proximo; }; valor proximo valor proximo valor proximo (Listas Encadeadas) 15 / 21

Criando uma lista 1 struct tipo_ l { 2 int valor ; 3 struct tipo_ l * proximo ; 4 }; 5 6 typedef struct { 7 struct tipo_ l * inicio ; 8 int quantidade ; 9 } Tipo_Lista ; Tipo_Lista Inicio Quantidade struct tipo_elemento valor proximo (Listas Encadeadas) 16 / 21

Lista completa Inicio Quantidade valor proximo valor proximo valor proximo valor proximo valor proximo (Listas Encadeadas) 17 / 21

Criando uma lista 1 # include <stdio.h> 2 # include <stdlib.h> 3 4 struct tipo_elemento { 5 int valor ; 6 struct tipo_elemento * proximo ; 7 }; 8 9 typedef struct { 10 struct tipo_elemento * inicio ; 11 int quantidade ; 12 } Tipo_Lista ; 13 14 void inicializa ( Tipo_Lista * a) { 15 a-> quantidade =0; 16 a-> inicio = NULL ; 17 } (Listas Encadeadas) 18 / 21

Criando uma lista 1 void insere ( Tipo_ Lista * a, int numero ) { 2 struct tipo_elemento * tmp ; 3 tmp = ( struct tipo_elemento *) malloc ( sizeof ( struct tipo_elemento )); 4 tmp -> valor = numero ; 5 6 if ( a- > quantidade == 0) 7 tmp -> proximo = NULL ; 8 else 9 tmp -> proximo = a-> inicio ; 10 11 a-> inicio = tmp ; 12 a-> quantidade ++; 13 } (Listas Encadeadas) 19 / 21

Criando uma lista 1 void mostra ( Tipo_Lista m) 2 { 3 struct tipo_elemento * tmp ; 4 tmp = m. inicio ; 5 6 while ( tmp!= NULL ) 7 { 8 printf (" Valor =%d\n",tmp -> valor ); 9 tmp = tmp -> proximo ; 10 } 11 } (Listas Encadeadas) 20 / 21

Criando uma lista 1 void elimina ( Tipo_ Lista * a, int alvo ) { 2 struct tipo_elemento * tmp, * ant ; 3 tmp =a-> inicio ; 4 5 while ( tmp!= NULL ) { 6 if (tmp -> valor == alvo ) { 7 // O elemento a ser eliminado o primeiro 8 if ( a-> inicio == tmp ) 9 a-> inicio = tmp -> proximo ; 10 else ant -> proximo = tmp -> proximo ; 11 free ( tmp ); 12 a-> quantidade - -; 13 return ; 14 } 15 ant = tmp ; 16 (Listas Encadeadas) tmp = tmp -> proximo ; 21 / 21