UNIRP Resumo Listas Encadeadas Dinamicas

March 24, 2018 | Author: Yuri Igor Marchioni | Category: Pointer (Computer Programming), Computer Data Storage, Data, Software Engineering, Computer Data


Comments



Description

LISTAS ENCADEADAS DINÂMICASCONCEITOS BÁSICOS: é uma sequencia de nós, cuja relação de sucessão é estabelecida por um ponteiro de endereço do próximo nó. Diferentemente das listas sequenciais, em que a sucessão dos nós é estabelecida de forma física ou contígua, nas listas encadeadas, a sucessão dos nós é estabelecida de forma lógica. Para cada novo elemento inserido na estrutura, alocamos um espaço de memória para armazená-lo. Dessa forma, o espaço total de memória gasto pela estrutura é proporcional ao número de elementos armazenado. No entanto, não podemos garantir que os elementos armazenados na lista ocuparão um espaço de memória contíguo; portanto, não temos acesso direto aos elementos da lista. Para percorrer todos os elementos, devemos explicitamente guardar o seu encadeamento, o que é feito armazenando-se, junto com a informação de cada elemento, um ponteiro para o próximo elemento da lista. Sendo assim, em uma lista encadeada dinâmica, cada elemento é chamado nó. Cada nó é composto por dois campos: • info: contém a informação do nó; • prox: contém o endereço do próximo nó. Os nós da lista estão ligados entre si pelo campo prox e mostram o encadeamento (a ligação de um nó a nó). O campo prox é chamado ponteiro para o próximo nó. Lista encadeada dinâmica = é acessada a partir de um ponteiro p que aponta para o primeiro elemento (nó) da lista. O campo prox do último nó da lista armazena o valor NULL, que indica o final da lista. Arranjo da memória de uma lista encadeada A estrutura consiste em uma sequencia encadeada de elementos, os nós da lista. A lista é representada por um ponteiro para o primeiro elemento (nó). Do primeiro elemento, podemos alcançar o segundo, seguindo o encadeamento, e assim por diante. O último elemento da lista armazena, como próximo elemento, um ponteiro inválido, com valor NULL, e sinaliza, assim, que não existe um próximo elemento. Uma lista sem nó é chamada lista vazia ou lista nula e seu ponteiro p é nulo (NULL). Exemplo: . x. ou Temos que “x” é um nó da lista. e a estrutura de lista encadeada é representada pelo ponteiro para seu primeiro elemento (tipo Lista*). portanto: p->info.info. Lista *p. //acessa a informação do nó //acessa o endereço do próximo nó O endereço de uma lista encadeada é o endereço do seu primeiro nó. então: • p = NULL. portanto: x. //acessa a informação do nó //acessa o endereço do próximo nó Temos que “p” é um ponteiro para um nó da lista.. Se p é uma lista. //lista vazia • p->prox. } Lista.. p->prox. //nó da lista //ponteiro para um nó da lista p = (Lista*) malloc(sizeof(Lista)). struct no *prox.prox. Sabendo que <tipo> pode ser: int char float vetor struct . //é uma lista .Declaração do Nó da Lista struct no { <tipo> info. O tipo Lista representa um nó da lista. Lista x. ou typedef struct no { <tipo> info. typedef struct no Lista. p = &x. se p aponta para o primeiro nó da lista. pois ele é o único endereço acessível diretamente. }. struct no *prox. então podemos dizer que p é a lista. Portanto. no final. (h) etc. Todas estas operações serão discutidas e implementadas. (e) remoção tendo um endereço como referencia para exclusão do nó. pois não existem elementos na lista. uma lista vazia é representada pelo ponteiro NULL. antes/depois de uma posição . (c) inserção tendo um endereço com referencia.. que são: (a) definição da estrutura da lista. o valor de retorno é NULL. Função de Criação A função que cria uma lista vazia deve ter como valor de retorno uma lista sem nenhum elemento. no meio. isto é. } Função de Inserção Criada a lista vazia. (d) alocação de um endereço do nó para inserção na lista. podemos inserir nela novos elementos. (g) localização de um elemento da lista. A função tem como valor de retorno a lista vazia inicializada.. antes/depois de um elemento. (f) desalocação do nó que foi removido da lista. Uma possível implementação da função de criação: /* função de criação: retorno uma lista vazia */ Lista * cria_lista(void) { return NULL. Em uma lista com/sem cabeça. temos os procedimentos básicos sobre listas encadeadas.Operações com Listas Além da representação dos nós. podemos inserir um novo elemento: no início. Como a lista é representada pelo ponteiro para o primeiro elemento. (b) inicialização da lista. Para cada elemento inserido. Devemos notar que o ponteiro que representa a lista deve ter seu valor atualizado. . pois a lista deve passar a ser representado pelo ponteiro para o novo primeiro elemento. devemos alocar dinamicamente a memória necessária para armazenar o elemento e encadeá-lo na lista existente. representada pelo ponteiro para o novo elemento. Por essa razão. novo->info = x. Inserção no Início – Lista SEM cabeça 1º passo) Alocação de memória 2º passo) Preencher o campo info 3º passo) novo->prox = p. /* inserção no início: retorna a lista atualizada */ Lista * insere_lista(Lista *p. 4º passo) p = novo. Ilustração de lista vazia: Ilustração de lista com elementos: IMPLEMENTAÇÃO Uma possível implementação dessa função é mostrada a seguir. A função de inserção mais simples insere o novo elemento no início da lista. a função de inserção recebe como parâmetros de entrada a lista na qual será inserido o novo elemento e a informação do novo elemento e tem como valor de retorno a nova lista. int x) { Lista *novo. novo = (Lista *) malloc(sizeof(Lista)). } main() { int x. scanf(“ %c”. &x). &resp). } . p= insere_lista(p.x). } while (resp == ‘S’ || resp == ‘s’). p = novo. scanf(“%d”. do { puts(“Insira um numero inteiro: “). Lista *p = NULL. return (p). char resp = ‘S’. puts(“Insere outro elemento [S/N]: “). fflush(stdin).novo->prox = p.
Copyright © 2024 DOKUMEN.SITE Inc.