• Nenhum resultado encontrado

Tema 05_Slides

N/A
N/A
Protected

Academic year: 2021

Share "Tema 05_Slides"

Copied!
15
0
0

Texto

(1)

Estrutura de Dados Tema 5: Listas.

O que é uma lista dinâmica

Um conjunto de itens dispostos linearmente, onde a inserção e a remoção de itens podem acontecer em qualquer ponto.

início

D E

10C54 79C32

10C54

79C32 NULL

Características básicas de uma lista dinâmica

Possui um ponteiro externo que indica o primeiro elemento da lista;

Cada elemento da lista contém os dados necessários (número, letra, nome, cadastros, etc) e um ponteiro que

indica a localização do próximo elemento; Não há limitação para a

(2)

Analisando uma lista graficamente Inserir os elementos G, H, A em uma lista

Analisando uma lista graficamente Remover os elementos D, X e M da lista

início D E 10C54 79C32 AC432 79C32 1928D X AC432 10C54 M 1928D NULL

Lista duplamente encadeada

início D E 10C54 79C32 AC432 79C32 1928D X AC432 10C54 M 1928D NULL NULL AC432 10C54 79C32

(3)

Lista como um Tipo de Dado Abstrato Características:

Conjunto de elementos;

Início para indicar o 1º elemento inserido Cada elemento deve indicar o seu sucessor Em lista duplamente

enca-deada, cada elemento deve indicar o seu antecessor

Lista como um Tipo de Dado Abstrato Operações:

Inserir novo elemento no início Inserir novo elemento no fim Inserir novo elemento no meio Remover elemento do início Remover elemento do fim Remover elemento do meio Verificar se está vazia Mostrar elementos

Criando uma lista encadeada simples struct listaSimples

{ int el;

struct listaSimples *prox; };

(4)

Criando uma lista duplamente encadeada

struct listaDupla { int el;

struct listaDupla *ant; struct listaDupla *prox; };

Continuando Tema 5: Listas.

Usando uma lista encadeada simples para cadastrar letras em ordem alfabética

#include <stdio.h> #include <stdlib.h> struct lista

{ char letra; struct lista *prox; };

(5)

int empty (lista *l) { if (l==NULL) return true; else return false; }

void inserir_inicio(lista **inicio, lista **fim, char c) { lista *novo; novo = new(lista); novo->letra = c; novo->prox = *inicio; *inicio = novo; if (*fim == NULL) *fim = novo; }

void inserir_fim(lista **inicio, lista **fim, char c) { lista *novo; novo = new(lista); novo->letra = c; novo->prox = NULL; if (*fim == NULL) *inicio = novo; else (*fim)->prox = novo; *fim = novo;

(6)

void inserir_ordenado(lista **i, lista **f, char c) { lista *aux, *ant;

aux = *i;

while (aux != NULL && aux->letra < c) { ant = aux;

aux = aux->prox; }

if (aux == *i) inserir_inicio(i, f, c); else

if (aux == NULL) inserir_fim(i, f, c); else { lista *novo;

novo = new(lista); novo->letra = c; novo->prox = aux; ant->prox = novo; } }

void remover(lista **i, lista **f, char c) { if (empty(*i)) return;

else {

lista *aux, *ant; aux = *i;

while (aux != NULL && aux->letra != c) { ant = aux;

aux = aux->prox; }

(7)

if (aux == *i) { *i = (*i)->prox; delete (aux); } else if (aux == NULL)

{ ant->prox = NULL; delete(aux); } else { ant->prox=aux->prox; delete(aux); } } }

void listar(lista *inicio) { lista *aux;

if (inicio==NULL) return; else { aux = inicio;

while (aux!=NULL) { printf("%c\n",aux->letra); aux = aux->prox; } } } int main()

{ lista *i=NULL, *f=NULL;

printf("\n%s esta vazia\n",empty(i)?"":"Não"); listar(i);

printf("\nInserir 1:"); inserir_ordenado(&i,&f,'a');

printf("\n%s esta vazia\n",empty(i)?"":"Não"); listar(i);

(8)

printf("\nInserir 2:"); inserir_ordenado(&i,&f,'c');

printf("\n%s esta vazia\n",empty(i)?"":"Não"); listar(i);

printf("\nInserir 3:"); inserir_ordenado(&i,&f,'b');

printf("\n%s esta vazia\n",empty(i)?"":"Não"); listar(i); printf("\nRemover 1:"); remover(&i, &f, 'b'); listar(i); printf("\nRemover 2:"); remover(&i,&f, 'a'); listar(i); printf("\nRemover 3:"); remover(&i, &f, 'c'); listar(i);

printf("\n%s esta vazia\n",empty(i)?"":"Não"); system("pause");

}

Agora é sua Vez

(9)

Implementar uma lista dinâmica duplamente encadeada para cadastrar funcionários (nome e idade) ordenados alfabeticamente.

Mostrar o conteúdo da lista em ordem direta (do início para o fim) e invertida (do fim para

o início). #include <stdio.h> #include <stdlib.h> #include <string.h> struct pessoa { char nome[30]; int codigo; }; struct lista

{ struct pessoa func; struct lista *ant; struct lista *prox; };

int empty (lista *l) { if (l==NULL) return true; else return false; }

(10)

void inserirInicio(lista **i, lista **f, struct pessoa p){ lista *novo; novo = new(lista); novo->func = p; novo->prox = *i; novo->ant=NULL; *i = novo; if (*f== NULL) *f = novo; }

void inserirFim(lista **i, lista **f, struct pessoa p){ lista *novo; novo = new(lista); novo->func = p; novo->prox = NULL; novo->ant = *f; if (*f == NULL) *i = novo;

else (*f)->prox = novo; *f = novo;

}

void inserirOrdem(lista **i,lista **f, struct pessoa p){ lista *aux, *ant;

aux = *i;

while (aux != NULL &&

strcmp(aux->func.nome, p.nome) < 0) { ant = aux;

aux = aux->prox; }

(11)

if (aux == *i) inserirInicio(i, f, p); else if (aux == NULL) inserirFim(i, f, p);

else { lista *novo; novo = new(lista); novo->func = p; novo->prox = aux; novo->ant = ant; ant->prox = novo; aux->ant = novo; } }

void listar(lista *i) { lista *aux;

if (i==NULL) printf("\nLista vazia!!!"); else { aux = i; while (aux!=NULL) { printf("Codigo: %d Nome:%s\n",aux->func.codigo, aux->func.nome); aux = aux->prox; } } } void listarInvertida(lista *f) {

if (f==NULL) printf("\nLista vazia!!!"); else { lista *aux = f;

while (aux!=NULL) { printf("Codigo: %d”, aux->func.codigo); printf(“Nome: %s\n”, aux->func.nome); aux = aux->ant; } } }

(12)

int main()

{ lista *i=NULL, *f=NULL; struct pessoa temp; printf("\nInserir 1:\n"); temp.codigo = 10; strcpy(temp.nome, "Ana"); inserirOrdem(&i, &f, temp); listar(i); printf("\nInserir 2:\n"); temp.codigo = 2; strcpy(temp.nome, "Zelia"); inserirOrdem(&i, &f,temp); listar(i); printf("\nInserir 3:\n"); temp.codigo = 50; strcpy(temp.nome, "Lucia"); inserirOrdem(&i, &f,temp); listar(i); listarInvertida(f); system("pause"); }

(13)

Finalizando

Tema 5: Listas.

Complementar o exercício anterior removendo funcionários

Deverá ser informado o nome do funcionário a ser retirado da lista.

Após a remoção os ele-mentos devem continuar ordenados alfabeticamente. início Lucia Maria 10C54 79C32 AC432 79C32 1928D Ana AC432 10C54 Zelia 1928D NULL NULL AC432 10C54 79C32 Exemplificando a remoção

(14)

void remover(lista **i, lista **f, struct pessoa p) { if (empty(*i)) return;

else { lista *aux, *ant; aux = *i;

while (aux!=NULL &&

strcmp(aux->func.nome,p.nome)!=0) { ant = aux;

aux = aux->prox; } //fim while

if (aux == NULL) printf("\n\nNome nao cadastrado.\n");

else { if (aux == *i) {

if ((*i)->prox !=NULL) { *i = (*i)->prox; (*i)->ant = NULL; } else { *i=NULL; *f=NULL; } delete (aux); }

else {if (aux->prox == NULL) { ant->prox = NULL; delete(aux); }

else { ant->prox = aux->prox; aux->prox->ant = ant; delete(aux); } } } //fim else } //fim else }//fim remover

(15)

int main()

{ lista *i=NULL, *f=NULL; struct pessoa temp; ...

printf("\nRemover 1:"); strcpy(temp.nome, "Lucia"); remover(&i, &f, temp); listar(i);

printf("\nRemover 2:"); strcpy(temp.nome, "Zelia"); remover(&i, &f, temp); listar(i);

printf("\nRemover 3:"); strcpy(temp.nome, "Ana"); remover(&i, &f, temp); listar(i);

system("pause"); }

Conclusões

 Listas representam um tipo de dado abstrato linear, capaz de armazena infinitos elementos;  As inserções e remoções podem acontecer em

qualquer posição de uma lista;  Listas permitem mais

facilmente a

manutenção de elementos ordenados.

Referências

Documentos relacionados

É plausível versar sobre os rituais de consumo como dispositivos entre os personagens e os produtos/marcas na ficção, ou enquanto dispositivos na realidade entre pessoas e

Os estudos originais encontrados entre janeiro de 2007 e dezembro de 2017 foram selecionados de acordo com os seguintes critérios de inclusão: obtenção de valores de

A seleção portuguesa feminina de andebol de sub-20 perdeu hoje 21-20 com a Hungria, na terceira jornada do Grupo C do Mundial da categoria, a decorrer em Koprivnica, na

In the results, we assessed the correlation between finger survival of those who were submitted to reim- plantation and/or revascularization and the patients´ factors related

Declara-se, em conformidade com o disposto no Estatuto aprovado pelo Decreto-Lei n.º 119/83, de 25 de fevereiro, adaptado pelo Decreto Legislativo Regional n.º 26/84/A,

ensino superior como um todo e para o curso específico; desenho do projeto: a identidade da educação a distância; equipe profissional multidisciplinar;comunicação/interatividade

A lo largo del siglo XX, y especialmente después de la Segunda Guerra Mundial, se constata en las formaciones sociales capitalistas en general, aunque con variaciones

aduncum em quatro di- ferentes locais no Distrito Federal, que apresentaram rendimento de óleo essencial variando entre 0,7% a 1,3% (em peso seco de folhas).. Indivíduos coletados