1 / 11

Principais operações em Listas

Principais operações em Listas. TPA - 2009-2. Listas Simples Inserção no Final void insereNofinalDaLista (Lista *l, Elemento e){ Lista paux,p ; p = malloc ( sizeof ( struct nodo )); p-> prox =NULL; p->e=e; if (*l == NULL) { *l =p; } else { paux = *l;

salim
Download Presentation

Principais operações em Listas

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Principais operações em Listas TPA - 2009-2

  2. Listas Simples Inserção no Final • voidinsereNofinalDaLista(Lista *l, Elemento e){ • Listapaux,p; • p =malloc(sizeof(structnodo)); • p->prox=NULL; • p->e=e; • if (*l == NULL) { • *l =p; • } • else { • paux = *l; • while(paux->prox){ • paux=paux->prox; • } • paux->prox=p; • } • }

  3. Insere no final da lista Recursivamente • voidinsereNofinalDaListaRec(Lista *l, Elemento e){ • if (*l == NULL) { • *l = malloc(sizeof(structnodo)); • (*l)->e=e; • (*l)->prox = NULL; • } • else • insereNofinalDaLista( &((*l)->prox), e); • }

  4. Inserção Ordenada – • voidinsereListaOrdenada(Lista *l, Elemento e){ • Listapaux,pant,p; • p = malloc(sizeof(structnodo)); • p->e=e; • p->prox = NULL; • if (*l == NULL) { • *l=p; • } • else{ • pant=*l; • paux = pant->prox; • while(paux!=NULL){ • if((paux)->e.codigo>=e.codigo){ • break; • } • pant=paux; • paux=paux->prox; • } • p->prox=paux; • pant->prox = p; • } • }

  5. Remove da Lista um elemento arbitrário • Elemento removeDaLista(Lista *l, intcodigo){ • Lista paux; • Elemento e; • if(*l==NULL){ • return e; • } • if((*l)->e.codigo== codigo){ • paux = *l; • *l=(*l)->prox; • e = paux->e; • free(paux); • return e; • } • else { • returnremoveDaLista(&((*l)->prox),codigo); • } • }

  6. Lista Circular Inserção • voidinsereaDireita(Lista *l, Elemento e){ • Lista p; • p = malloc(sizeof(structnodo)); • p->e = e; • if (*l==NULL){ /* Lista vazia */ • p->prox = p; • *l = p; • } • else { • p->prox = (*l)->prox; • (*l)->prox = p; • } • }

  7. Remoção • intremoveaDireita(Lista *l, Elemento *ret){ • Lista paux; • if (*l == NULL){ • return 0; • } • else { • paux = (*l)->prox; • *ret = paux->e; • if (*l==paux){ /* Lista com apenas um nó */ • *l = NULL; • } • else{ • (*l)->prox = paux->prox; • } • free(paux); • return 1; • } • }

  8. Remoção de elemento arbitrário • Elemento removeElemento(Lista *l, intcodigo){ • Lista paux1,paux2; • Elemento e; • if(*l==NULL){ • return e; • } • paux1=*l; • paux2=paux1->prox; • do{ • if (paux2->e.codigo==codigo){ • break; • } • paux1=paux2; • paux2=paux2->prox; • }while(paux2!=*l); • if(paux2->e.codigo!=codigo){ • // elemento não encontrado • return e; //retorna e vazio; • } • paux1->prox = paux2->prox; • e = paux2->e; • if(*l==paux2){ /* se o nodo procurado é o apontado por l*/ • if(paux1!=paux2){ /* lista com mais de um nodo */ • *l=paux1; • } • else { /* lista com um so nodo */ • *l=NULL; • } • } • free(paux2); • return e; • }

  9. Lista duplamente encadeada • voidinsereNaLista(Lista *l, Elemento e){ • Lista p; • p = malloc(sizeof(struct nodo)); • p->e = e; • if (*l==NULL){ /* Lista vazia */ • p->prox = p; • p->ant=p; • *l = p; • } • else { • (*l)->ant->prox=p; • p->prox=(*l); • p->ant=(*l)->ant; • (*l)->ant=p; • (*l)=p; • } • }

  10. Remoção • Elemento removeDaLista(Lista *l){ • Elemento e; • Lista anterior, proximo; • if(*l==NULL){ // lista vazia • return e; • } • if(*l==(*l)->ant) { // lista de um nodo somente • e=(*l)->e; • free(*l); • *l=NULL; • return e; • } • anterior=(*l)->ant; • proximo = (*l)->prox; • anterior->prox=proximo; • proximo->ant=anterior; • e=(*l)->e; • free(*l); • *l=proximo; • return e; • }

  11. Removendo elemento arbitrário. • Elemento removeElemento(Lista *l, intcodigo){ • Lista aeliminar, proximo,anterior; • Elemento e; • if(*l==NULL){ // 1.lista vazia • return e; • } • aeliminar = *l; • do { • if(aeliminar->e.codigo==codigo) • break; • aeliminar=aeliminar->prox; • }while(aeliminar!=*l); • if (aeliminar->e.codigo!=codigo){ // 2.elemento nao existe • return e; • } • if ((*l)->ant==(*l)){ // 3. so um elemento na lista • *l=NULL; • return e; • } • else{ • anterior = aeliminar->ant; • proximo = aeliminar->prox; • anterior->prox=proximo; • proximo->ant=anterior; • if(aeliminar==*l){ // 4. se eliminar o elemento apontado por l atualizo l • *l=proximo; • } • } • e = aeliminar->e; • free(aeliminar); • return e; • }

More Related