Listas lineares
Embed Size (px)
description
Transcript of Listas lineares
-
Listas lineares
Denise GuliatoFaculdade de Computao UFUwww.facom.ufu.br/~guliato
Vrios slides foram adaptados de Nina Edelwais e Renata GalanteEstrutura de Dados Srie de Livros Didticos - Informtica - UFRGS
-
Listas linearesLista encadeada circular
-
LL encadeada circularLL encadeada circularPtLista Elo do ltimo nodo indica endereo do primeiro Lista pode ser percorrida a partir de qualquer nodo Lista com 1 s nodo: elo do nodo aponta para ele mesmoPtListaCrdito do slide para Nina Edelwais e Renata Galante Denise Guliato
-
LL encadeada circularOperaes bsicas Criar uma lista Inserir novo nodo Remover um nodo Consulta um nodo Destruir listaAlgoritmosSemelhantes a LL encadeada simplesCrdito do slide para Nina Edelwais e Renata Galante Denise Guliato
-
Algoritmo: criar lista circularLista* Cria_lista(void)Lista* Cria_lista(void){ return NULL;}
-
Insero de um novo nodo Definir a posio de insero Alocar o novo nodo Preencher com valor Encadear adequadamenteLL encadeada circularCrdito do slide para Nina Edelwais e Renata Galante Denise Guliato
-
Insero de um novo nodo num dos extremos da lista
Inserir um nodo em uma lista circular vazia
-
Insero de um novo nodo num dos extremos da listaOnde inserir ????Insero de um novo nodo no inicio da lista Ptlista Ptlista
-
Insero de um novo nodo num dos extremos da listaOnde inserir ????
Insero de um novo nodo no final da lista Ptlista Ptlista
-
Lista* Insere_elem(Lista* Ptl, int elem) { Lista *Ptnodo, *aux; Ptnodo = (Lista*)malloc(sizeof(struct no)); if (Ptnodo == NULL) return Ptl;
Ptnodo->info = elem;
if (Ptl == NULL) // lista vazia { Ptl = Ptnodo; Ptnodo->prox = Ptl; } else //lista nao esta vazia,insere no final { aux = Ptl; while (aux->prox != Ptl) aux = aux->prox; Ptnodo->prox = Ptl; aux->prox = Ptnodo; } return Ptl;}Algoritmo: inserir um nodo no final da listaLista* Insere_elem(Lista* Ptl,int elem)
-
Remoo de um nodoLL encadeada circularPtListaPtLista Localizar posio do nodo Adequar encadeamentos Liberar nodoCrdito do slide para Nina Edelwais e Renata Galante Denise Guliato
-
Remoo de um nodo
Remover nodo de uma lista vazia NO POSSVEL
-
Remoo de um nodo
Remover nodo de uma lista vazia NO POSSVELRemover o nodo de uma lista com um nico nodo
-
Remoo de um nodoRemover o primeiro nodo de uma lista qualquerPtListaPtListaslide adaptado de Nina Edelwais e Renata Galante Denise Guliato
-
Remoo de um nodoRemover o nodo qualquer de uma listaPtListaPtListaSlide adaptado de Nina Edelwais e Renata Galante Denise Guliato
-
Remoo de um nodoCaso 1: lista vazia
Caso 2:nodo a ser removido o primeiro e nico da lista
Caso 3:nodo a ser removido o primeiro mas no o nico
Caso 4:nodo a ser removido qualquer outro nodo da lista
-
Lista* Remove_elem(Lista* Ptl, int elem){ Lista *ant,*atual,*aux; if (Ptl == NULL) //lista vazia return Ptl;
atual = Ptl; ant = NULL; while (atual->prox != Ptl && atual->info != elem) { ant = atual; atual = atual->prox; }//continua
Algoritmo: Remover um nodo de LL Encadeada Circular dado o elemLista* Remove_elem(Lista *Ptl, int elem)
-
Algoritmo (cont): Remover nodo de LL Encadeada Circular dado o elemif (atual->info == elem) { if (ant == NULL) //primeiro nodo sera removido { aux=Ptl; while (aux->prox != Ptl) aux = aux->prox; //aux aponta para o ultimo nodo da lista if (aux == Ptl) //eh primeiro e o ultimo Ptl = NULL; else { // eh o primeiro mas nao o ultimo Ptl = atual->prox; aux->prox = Ptl; } } else ant->prox = atual->prox; free(atual); } return Ptl; }
-
LL encadeada circularConsulta nodo da listaLL encadeada circular Iniciar sempre acessando primeiro nodo da lista Seguir acessando de acordo com campos de elo Para quando encontrar novamente o primeiro nodo da listaL1L2L4L3PtListaL5Crdito do slide para Nina Edelwais e Renata Galante Denise Guliato
-
int Consulta_nodo(Lista* Ptl, int pos, int *elem){ int cont; Lista *pt; if( Ptl == NULL || pos prox != Ptl && cont < pos) { pt=pt->prox; cont++; } if (cont == pos) { *elem = pt->info; return 1; } else return 0;}Algoritmo: Consulta K-esimo nodo da Listaint Consulta_nodo(Lista *Ptl, int pos, int*elem)
-
Algoritmo: destruir lista circularLista* Libera_lista(Lista *Ptl)
Lista* Libera_lista(Lista* Ptl){ Lista *pt, *aux; if (Ptl == NULL) return NULL; pt = Ptl; while (pt->prox != Ptl) { aux = pt; pt = pt->prox; free(aux); } free(pt); return NULL; // Ptl = NULL; return Ptl;}
-
Algoritmo: destruir lista circularint Tamanho_lista(Lista *Ptl)int Tamanho_lista(Lista* Ptl){ Lista *pt; int cont;
if (Ptl == NULL) return 0;
pt = Ptl; cont = 1; while (pt->prox != Ptl) { pt = pt->prox; cont++; } return cont;}
-
Lista encadeada circularPodemos melhorar o custo computacional da insero?
Como?
Fazendo Ptl apontar para o ultimo nodo da lista circular
-
Lista encadeada circularPtlista aponta para o ltimo nodo da lista:Ptlista
-
Lista* Insere_elem(Lista* Ptl, int elem) { Lista *Ptnodo; Ptnodo = (Lista*)malloc(sizeof(struct no)); if (Ptnodo == NULL) return Ptl;
Ptnodo->info = elem;
if (Ptl == NULL) // lista vazia { Ptl = Ptnodo; Ptnodo->prox = Ptl; } else //lista nao esta vazia { Ptnodo->prox = Ptl->prox; Ptl->prox = Ptnodo; Ptl = Ptnodo; } return Ptl;}Algoritmo: inserir um nodo no final da listaLista* Insere_elem(Lista* Ptl,int elem)
-
Lista encadeada circular
Como ficaria a funo de remoo???
-
Lista* Remove_elem(Lista* Ptl, int elem){ Lista *ant,*atual,*aux; if (Ptl == NULL) //lista vazia return Ptl;
atual = Ptl->prox; ant = Ptl; while (atual!= Ptl && atual->info != elem) { ant = atual; atual = atual->prox; } if (atual->info == elem) { if (atual == ant) //nico nodo Ptl = NULL; else { ant->prox = atual->prox; if (atual == Ptl) //ultimo nodo a ser removido Ptl = ant; } free(atual); } return Ptl; }Algoritmo: Remover um nodo de LL Encadeada Circular dado o elemint Remove_elem(Lista *Ptl, int elem)
-
Algoritmo (cont): Remover nodo de LL Encadeada Circular dado o elem
-
Exerccio (baseado no problema de Josephus)Considere o seguinte jogo:N pessoas identificadas por um nome e um nmero inteiro esto sentadas em crculo, organizadas aleatoriamente. Um nmero sorterado no intervalo [1,N]. A pessoa associada a este nmero sai do crculo. Um novo nmero sorteado. Contando da pessoa seguinte quela que saiu, a ensima pessoa sai do crculo. O sorteio continua at que reste apenas uma pessoa.
-
Exerccio para entregarFaa um programa que, usando a lladaec.h, forme o circulo de pessoas, lembrando que so N pessoas sentadas aleatoriamente. Sorteie, a cada iterao um nmero, e retire uma pessoa do crculo, conforme as regras do jogo. A cada sada, grave em disco a posio e o numero de quem saiu.No final do jogo, grave o nome e o nmero da pessoa que sobrou e indique seu premio ou castigo.
**