Listas lineares

of 30 /30
Listas lineares Listas lineares Denise Guliato Faculdade de Computação – UFU www.facom.ufu.br/~guliato Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados – Série de Livros Didáticos - Informática - UFRGS

Embed Size (px)

description

Listas lineares. Denise Guliato Faculdade de Computação – UFU www.facom.ufu.br/~guliato. Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados – Série de Livros Didáticos - Informática - UFRGS. Listas lineares. Lista encadeada circular. - PowerPoint PPT Presentation

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.

    **