Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados Ponteiros Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Ponteiros Um ponteiro é uma variável que contém um endereço de memória. Esse endereço de memória é normalmente a posição de uma outra variável na memória. Se uma variável contém o endereço de memória de uma outra, então a primeira variável é dita apontar para a segunda.
Exemplo de ponteiro Endereço na memória Variável na memória 1000 1001 1002 1003 1004 1001 1005
Declaração de ponteiro Para utilizar uma variável ponteiro, ela deve ser declarada da seguinte maneira: tipo *nome_ponteiro; Exemplo: int *p;
Operadores de ponteiros Existem 2 operadores unários: * - obtém o conteúdo do endereço apontado & - obtém o endereço de memória do operando.
Exemplo char *pont; int t; char texto[] = "marieta das graças"; pont = &texto[0]; for(t=strlen(pont)-1; t>=0; t--){ printf("%c", pont[t]); }
Lista Dinâmica Encadeada
Listas dinâmicas x estáticas Embora os algoritmos de manipulação de listas com alocação estática sejam relativamente simples, seu uso prático é limitado, principalmente se for considerado a otimização de uso da memória. Duas situações são bastante comuns: tamanho da lista é superdimensionado, havendo neste caso um possível desperdício de memória; a lista é dimensionada com o tamanho inferior ao necessário – nesta situação ou tempo de processamento adicional deve ser inserido para criar uma nova lista, maior que a original, e copiar os dados de uma lista para outra. A solução é utilizar listas alocadas dinamicamente.
Lista Dinâmica Encadeada Uma lista encadeada é constituída de nós ou nodos. Cada nó contém, no mínimo, dois campos: uma refere-se ao dado armazenado na lista naquela posição, a outra refere-se a um ponteiro a outro nó na mesma lista. O dado é a própria informação da aplicação, o ponteiro (ou ponteiros) permite o encadeamento da lista. Denomina-se o primeiro nó da lista de cabeça e o último de último.
Lista Dinâmica Encadeada Em listas dinâmicas, cada novo dado inserido na lista é encapsulado em um nó, e este nó é alocado dinamicamente, ou seja, conforme necessidade do programa em execução e inserido na lista. A utilização de lista dinâmica consome um tempo maior de processamento, pois requer alocação e liberação dinâmica de memória, no entanto, na prática, o ganho e a versatilidade frente a estratégias estáticas é muito maior. NULL
Lista Dinâmica Encadeada Uma lista encadeada é uma sucessão de nós onde cada nó aponta para o próximo nó da lista. O nó que possuir o valor NULL no ponteiro para próximo é o último nó da lista. É de extrema importância que seja mantida uma referência para o primeiro nó da lista, caso esta referência for NULL, significa que a lista esta vazia. Em certas situações também é útil possuir uma referência ao último nó.
Exemplo de estrutura de nó struct Registro { int codigo; char nome[50]; Registro *proximo; };
Alocação dinâmica Malloc() – aloca memória Free() – libera memória registro *no; no = (registro*) malloc(sizeof(registro));
Atividade: Operações sobre Listas Encadeadas Dinâmicas Criar lista vazia Inserir no início de uma lista Inserir no fim de uma lista Exibir se a lista está vazia Exibir os dados do primeiro elemento Exibir os dados do último elemento Exibir todos os valores da lista Exibir o tamanho da lista Eliminar o primeiro elemento Eliminar o último elemento Eliminar o nó que possua o código digitado pelo usuário