Baixe o app para aproveitar ainda mais
Prévia do material em texto
ESTRUTURA DE DADOS Aula 9 – LISTAS ENCADEADAS – 2a PARTE PILHA DINÂMICA e FILA DINÂMICA ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 Atenção aos Temas Principais dessa Aula ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 Conteúdo Programático desta aula Compreender operaões com Lista Linear Simplesmente Encadeada; Compreender operaões com Pilha Dinâmica; Compreender operaões com Fila Dinâmica; ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 Direto ao Assunto ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 2a parte ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 Listas de debates; Gerenciamento de memória; Alocação encadeada de arquivos sequenciais na tentativa de eliminar a fragmentação externa de um HD, entre outras. Aplicações – LISTAS SIMPLESMENTE ENCADEADAS ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 struct nodo { int num; struct nodo *prox; }; 1) Definindo a struct ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 struct nodo { int num; struct nodo *prox; }; // primeiro nó nodo *lista=new nodo; lista->num=23; lista->prox=NULL; 2) A struct e criação do 1o nó num prox ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // segundo nó lista->prox=new nodo; lista->prox->num=13; lista->prox->prox=NULL; 3) Criação do 2o nó prox ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // segundo nó lista->prox=new nodo; lista->prox->num=13; lista->prox->prox=NULL; 3) Criação do 2o nó prox prox->num prox->prox ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // terceiro nó lista->prox->prox=new nodo; lista->prox->prox->num=15; lista->prox->prox->prox=NULL; 4) Criação do 3o nó prox ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // terceiro nó lista->prox->prox=new nodo; lista->prox->prox->num=15; lista->prox->prox->prox=NULL; prox->proxprox 4) Criação do 3o nó ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // terceiro nó lista->prox->prox=new nodo; lista->prox->prox->num=15; lista->prox->prox->prox=NULL; prox->prox->num prox->prox->prox prox->proxprox 4) Criação do 3o nó ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // quarto nó lista->prox->prox->prox=new nodo; lista->prox->prox->prox->num=18; lista->prox->prox->prox->prox=NULL; prox 5) Criação do 4o nó ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // quarto nó lista->prox->prox->prox=new nodo; lista->prox->prox->prox->num=18; lista->prox->prox->prox->prox=NULL; prox->proxprox 5) Criação do 4o nó ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // quarto nó lista->prox->prox->prox=new nodo; lista->prox->prox->prox->num=18; lista->prox->prox->prox->prox=NULL; prox->prox->proxprox->proxprox 5) Criação do 4o nó ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 // quarto nó lista->prox->prox->prox=new nodo; lista->prox->prox->prox->num=18; lista->prox->prox->prox->prox=NULL; prox->prox->proxprox->proxprox prox->prox->prox->num prox->prox->prox->prox 5) Criação do 4o nó ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 #include <iostream> #include <cstdlib> using namespace std; struct nodo { int num; struct nodo *prox; }; int main() { //primeiro nó nodo *lista=new nodo; lista->num=23; lista->prox=NULL; Código 1 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 //segundo nó lista->prox=new nodo; lista->prox->num=13; lista->prox->prox=NULL; //terceiro nó lista->prox->prox=new nodo; lista->prox->prox->num=15; lista->prox->prox->prox=NULL; //quarto nó lista->prox->prox->prox=new nodo; lista->prox->prox->prox->num=18; lista->prox->prox->prox->prox=NULL; Código 2 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 //listando um a um cout<<"\nValor do 1o no: "<<lista->num; cout<<"\nValor do 2o no: "<<lista->prox->num; cout<<"\nValor do 3o no: "<<lista->prox->prox->num; cout<<"\nValor do 4o no: "<<lista->prox->prox->prox->num; //liberando delete lista; lista=0; cout<<"\n\n"; system("pause"); } Código 3 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 #include <iostream> #include <cstdlib> using namespace std; int main() { struct nodo { int num; struct nodo* prox; }; //criando no1 nodo* no1=new nodo; no1->num=23; no1->prox=NULL; //criando no2 nodo* no2= new nodo; no1->prox=no2; no2->num = 13; no2->prox = NULL; Código 1 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 //exibindo cout<<"\nValor do no1: "<<no1->num; cout<<"\nValor do no2: "<<no2->num; cout<<"\n\n\nEndereco de no1: "<<no1; cout<<"\nEndereco de no2: "<<no2; cout<<"\n\n\nEndereco apontado por no1: "<<no1->prox; cout<<"\nEndereco apontado por no2: "<<no2->prox; //liberando delete no1; no1=0;delete no2; no2=0; cout<<"\n\n"; system("pause"); } Código 2 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 #include <iostream> #include <cstdlib> using namespace std; int main() { struct nodo { int num; struct nodo* prox; }; //criando no1 nodo* no1=new nodo; no1->num=23; no1->prox=NULL; //criando no2 nodo* no2= new nodo; no2->num = 13; no2->prox = no1; Código 1 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 //exibindo cout<<"\nValor do no1: "<<no1->num; cout<<"\nValor do no2: "<<no2->num; cout<<"\n\n\nEndereco de no1: "<<no1; cout<<"\nEndereco de no2: "<<no2; cout<<"\n\n\nEndereco apontado por no1: "<<no1->prox; cout<<"\nEndereco apontado por no2: "<<no2->prox; //liberando delete no1; no1=0;delete no2; no2=0; cout<<"\n\n"; system("pause"); } Código 2 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 struct nodo { int info; struct nodo *prox; }; Definido a struct ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 void exibe(nodo *ptr) { int conta = 1; cout<<"\nListando\n"; while(ptr) { cout<<"\n"<<conta<<"- "<<ptr->info; conta++; ptr=ptr->prox; } } Exibe lista ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo* insereFrente(nodo *ptr, int valor) { nodo *temp = new nodo; if(!temp) { cout<<"\nNao foi possivel fazer Alocacao\n"; system("pause"); exit (1); } temp->info = valor; temp->prox = ptr; return temp; } Insere nó na frente ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo* insereFim(nodo *ptr, int valor) { nodo *novo, *aux; novo = new nodo; if(!novo) { cout<<"\nNao foi possivel fazer Alocacao\n"; system("pause"); exit (1); } novo->info = valor; novo->prox = NULL; if (!ptr) ptr = novo; else { aux = ptr; while (aux->prox) aux = aux->prox; aux->prox = novo; } return ptr; } Insere nó ao final ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 int buscaSequencial(nodo *ptr, int valor,int &pos) { while (ptr) { pos++; if (ptr->info == valor) return 1; ptr = ptr->prox; } return 0; } Busca Sequencial ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 void substituiNo(nodo *ptr, int posicao, int novoValor) { int conta = 1; while (conta != posicao ) { ptr = ptr ->prox; conta++; } ptr->info = novoValor; } Substitui valor do Nó ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 int contaNos(nodo *ptr) { int conta = 0; while (ptr) { conta++; ptr = ptr->prox; } return conta; } Conta os nós ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo *removeFrente(nodo *ptr) { nodo *aux; aux = ptr; ptr = ptr->prox; delete aux; return ptr; } Remove nó da frente ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo* removeFim(nodo *ptr) { nodo * aux, *ultimo; if (!ptr->prox) { delete ptr; ptr = NULL; return ptr; } else { aux = ptr; //aux caminha até apontar para o penúltimo nó while (aux->prox->prox ) aux = aux->prox; ultimo = aux->prox; delete ultimo; aux->prox = NULL; return ptr; } } Remove nó do final ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 O alvo é procurar o penúltimo para que possa remover o último. Por essa razão, a linha aux->prox->prox estará sempre olhando o próximo do próximo porque se ele não existir, significa que aux->prox é o último. ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 void libera(nodo *ptr) { delete ptr; ptr=0; } Libera ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 Como a Pilha e a Fila são casos particulares da Lista, não introduzi nenhuma outra função. Todas as funções são as que foram as usadas na Lista, respeitando as características das estruturas. ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo *insereFrente(nodo *, int ); Insere na Pilha ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo *insereFrente(nodo *, int ); Insere na Pilha nodo *removeFrente(nodo *); Remove da Pilha ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 void exibeTopo(nodo *ptr) { if(!ptr) cout << "\n\nPilha vazia\n"; else cout<<"\nValor do elemento do topo: "<<ptr->info; } Exibe elemento do topo ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo *insereFim(nodo *, int ); Insere na Fila ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo *insereFim(nodo *, int ); Insere na Fila nodo *removeFrente(nodo *); Remove da Fila ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 void exibePrimeiro(nodo *ptr) { if(!ptr) cout << "\n\nFila vazia\n"; else cout<<"\nValor do primeiro elemento da Fila: "<<ptr->info; } Exibe primeiro elemento ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 Resumindo ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 & Menu Lista Simplesmente Encadeada ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 system("cls"); switch(op) { case 1:cout<<"\nInserir na frente: "; cin>>valor; lista = insereFrente(lista, valor); break; case 2:cout<<"\nInserir no final: "; cin>>valor; lista = insereFim(lista, valor); break; case 3:if(!lista) cout << "\n\nNada a remover. Lista vazia\n"; else { lista=removeFrente(lista); cout<<"\n\nPrimeiro elemento da Lista removido\n"; } break; ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 case 4:if(!lista) cout << "\n\nNada a remover. Lista vazia\n"; else { lista=removeFim(lista); cout<<"\n\nUltimo elemento da Lista removido\n"; } break; case 5:if(!lista) cout << "\n\nFILA vazia\n"; else exibe(lista); break; ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 case 6:if(!lista) cout<<"\nFila vazia\n"; else { cout<<"\nQual a posicao do No? "; cin>>pos; while(pos>contaNos(lista)) { cout<<"\nPosicao Invalida\n"; cout<<"\nQual a posicao do No? "; cin>>pos; } cout<<"\nQual o novo valor? "; cin>>nvalor; substituiNo(lista, pos, nvalor); cout<<"\nValor substituido\n"; } break; ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 case 7:if(!lista) cout << "\n\nLista vazia\n"; else cout<<"\nTotaL de nos: "<<contaNos(lista); break; case 8:if(!lista) cout << "\n\nLista vazia\n"; else { cout<<"\nQual o valor de procura? "; cin>>valor; posicao=0; resp=buscaSequencial(lista, valor, posicao); if(resp==1) cout<<"\nEncontrei na posicao "<<posicao<<"\n"; else cout<<"\nNao Encontrei\n"; } break; ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 case 9:if(lista) cout<<"\nTem elementos na Lista\n"; else{ libera(lista); cout<<"\nLiberando Memoria"; } break; case 10: cout<<"Fechando Lista Encadeada\n"; break; default:cout<<"\nOpcao Invalida\n"; } cout<<"\n\n"; system("pause"); } while(op != 10); return 0; } ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo* insereFrente(nodo *ptr, int valor) { nodo *temp = new nodo; if(!temp) { cout<<"\nNao foi possivel fazer Alocacao\n"; system("pause"); exit (1); } temp->info = valor; temp->prox = ptr; return temp; } ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo* insereFim(nodo *ptr, int valor) { nodo *novo, *aux; novo = new nodo; if(!novo) { cout<<"\nNao foi possivel fazer Alocacao\n"; system("pause"); exit (1); } novo->info = valor; novo->prox = NULL; if (!ptr) ptr = novo; else { aux = ptr; while (aux->prox) aux = aux->prox; aux->prox = novo; } return ptr; } ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 void exibe(nodo *ptr) { int conta = 1; cout<<"\nListando\n"; while(ptr) { cout<<"\n"<<conta<<" - "<<ptr->info; conta++; ptr=ptr->prox; } } nodo *removeFrente(nodo *ptr) { nodo *aux; aux = ptr; ptr = ptr->prox; delete aux; return ptr; } ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 nodo* removeFim(nodo *ptr) { nodo * aux, *ultimo; if (!ptr->prox) { delete ptr; ptr = NULL; return ptr; } else { aux = ptr; //aux caminha até apontar para o penultimo nó while (aux->prox->prox ) aux = aux->prox; ultimo = aux->prox; delete ultimo; aux->prox = NULL; return ptr; } } ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 void substituiNo(nodo *ptr, int posicao, int novoValor) { int conta = 1; while (conta != posicao ) { ptr = ptr ->prox; conta++; } ptr->info = novoValor; } int contaNos(nodo *ptr) { int conta = 0; while (ptr) { conta++; ptr = ptr->prox; } return conta; } ESTRUTURA DE DADOS LISTAS ENCADEADAS – 2a PARTE/ PILHA DINÂMICA e FILA DINÂMICA – Aula9 int buscaSequencial(nodo *ptr, int valor,int &pos) { while (ptr) { pos++; if (ptr->info == valor) return 1; ptr = ptr->prox; } return 0; } void libera(nodo *ptr) { delete ptr; ptr=0; }
Compartilhar