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
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
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; };
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; };
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;
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; }
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);
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
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; }
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; }
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; } } }
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"); }
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
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
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.