Sumário Armazenamento de dados Vectores Vectores dinâmicos Listas Tipos de dados dinâmicos Declaração Uso Exemplos Armazenamento de dados Tamanho conhecido antes compilação Vectores BI vect[200] Tamanho conhecido durante a execução Vectores dinâmicos BI * vect; Vect = (BI *) calloc (n, sizeof(bi)) 10-1 10-2 Armazenamento de dados E se comprimento variar? E se quisermos inserir ordenado? E se quisermos remover? E se o vector estiver cheio? Inserir 10 Complexo com vectores dinâmicos Solução Tipos dinâmicos 10-3 10-4 Inserir 12 10-5 10-6
10-7 10-8 10-9 10-10 E se estiver cheio? Se criado com calloc Redimensionamento do vector Senão 10-11 10-12
Memória Dinâmica Variáveis locais Existentes apenas dentro de uma função Acessíveis a partir dessa função Memória dinâmica Dados existem Entre criação e destruição Acessíveis por várias funções Evita sobredimensão dos vectores sizeof Retorna o número de bytes ocupados por uma variável dum tipo sizeof(char) 1 sizeof(int) 4 sizeof(char *) 4 sizeof(int *) 4 sizeof(bi *) 4 sizeof(bi) muitos 10-13 10-14 Inserir 10 Inserir 12 10-15 10-16 10-17 10-18
Fim 10-19 Declaração O tipo (estrutura) inclui Campo com os dados Campo com referência para outra estrutura (do mesmo tipo) struct dim_st{ tipodados x; struct dim_st *seg; } typedef struct dim_st dinamic; typedef struct dim_st{ tipodados x; struct dim_st *seg; }dinamic; 10-20 Declaração Declaração inválida linha 3: ainda não sabemos o que é dinamic 1. typedef struct dim_st{ 2. tipodados x; 3. dinamic *seg; 4. }dinamic; Criação Uma caixinha para cada valor Função malloc Semelhante ao calloc Mas só cria uma estrutura Novo = (tipo *) malloc (sizeof(tipo)); Pode retornar NULL se houver erro if (Novo == NULL) 10-21 10-22 Pilha Fila Lista Tipos dinâmicos NULL 10-23 Tipos dinâmicos/abstractos Operações Cria_nova Insere Remove Procura (só a lista) Cimo (só pilha) Primeiro (só fila) 10-24
Decisões Pilha O que é uma XXXX vazia Onde termina uma XXXX terminador Qual a ordem das setas Como se insere No início? No fim? No meio? Ordenado crescente Ordenado decrescente Usos Arrumar coisas :) Calculador RPN Inverter ordem de coisas Operação Inserir No cimo Retirar O último a entrar 10-25 10-26 Inserir Inserir(p1, 12) Onde? p1 Pilha NULL?? Gestão de memória Os blocos criados (calloc ou malloc) Devem ser sempre acessíveis Se não acessíveis são lixo Devem ser destruídos com o free char * ptr; ptr = (char *) malloc(sizeof(char));... free(ptr); 10-27 10-28