110 likes | 193 Views
Learn about various insertion methods, including recursive insertion, sorted insertion, and circular list insertion. Explore removal techniques for arbitrary or specific elements in both singly and doubly linked lists. Improve your data structure knowledge!
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; • }