110 likes | 192 Views
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;
E N D
Principais operações em Listas TPA - 2009-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; • } • }
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); • }
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; • } • }
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); • } • }
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; • } • }
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; • } • }
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; • }
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; • } • }
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; • }
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; • }