Principais operações em Listas

11
Principais operações em Listas TPA - 2009-2

description

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; - PowerPoint PPT Presentation

Transcript of Principais operações em Listas

Page 1: Principais operações em Listas

Principais operações em Listas

TPA - 2009-2

Page 2: Principais operações em Listas

Listas SimplesInserção no Final1. void insereNofinalDaLista(Lista *l, Elemento e){2. Lista paux,p;3. p =malloc(sizeof(struct nodo));4. p->prox=NULL;5. p->e=e;6. if (*l == NULL) {7. *l =p; 8. } 9. else {10. paux = *l;11. while(paux->prox){12. paux=paux->prox;13. }14. paux->prox=p;15. }16. 17. }

Page 3: Principais operações em Listas

Insere no final da lista Recursivamente1. void insereNofinalDaListaRec(Lista *l,

Elemento e){2. if (*l == NULL) {3. *l = malloc(sizeof(struct nodo));4. (*l)->e=e;5. (*l)->prox = NULL; 6. } 7. else8. insereNofinalDaLista( &((*l)->prox), e);9. } 10.

Page 4: Principais operações em Listas

Inserção Ordenada – 1. void insereListaOrdenada(Lista *l, Elemento e){2. Lista paux,pant,p;3. p = malloc(sizeof(struct nodo));4. p->e=e;5. p->prox = NULL; 6. 7. if (*l == NULL) {8. *l=p;9. }10. else{11. pant=*l;12. paux = pant->prox;13. while(paux!=NULL){14. if((paux)->e.codigo>=e.codigo){15. break;16. }17. pant=paux;18. paux=paux->prox;19. }20. p->prox=paux;21. pant->prox = p; 22. }23. }

Page 5: Principais operações em Listas

Remove da Lista um elemento arbitrário1. Elemento removeDaLista(Lista *l, int codigo){2. Lista paux;3. Elemento e;4. if(*l==NULL){5. return e; 6. } 7. if((*l)->e.codigo== codigo){8. paux = *l;9. *l=(*l)->prox;10. e = paux->e;11. free(paux);12. return e;13. } 14. else {15. return removeDaLista(&((*l)->prox),codigo); 16. }17. }

Page 6: Principais operações em Listas

Lista CircularInserção1. void insereaDireita(Lista *l, Elemento e){2. Lista p;3. p = malloc(sizeof(struct nodo));4. p->e = e;5. if (*l==NULL){ /* Lista vazia */6. p->prox = p;7. *l = p;8. } 9. else {10. p->prox = (*l)->prox;11. (*l)->prox = p;12. } 13. }

Page 7: Principais operações em Listas

Remoção 1. int removeaDireita(Lista *l, Elemento *ret){2. Lista paux;3. if (*l == NULL){4. return 0;5. } 6. else {7. paux = (*l)->prox;8. *ret = paux->e;9. if (*l==paux){ /* Lista com apenas um nó */10. *l = NULL;11. }12. else{13. (*l)->prox = paux->prox;14. } 15. free(paux);16. return 1;17. }18. }

Page 8: Principais operações em Listas

Remoção de elemento arbitrário1. Elemento removeElemento(Lista *l, int codigo){2. Lista paux1,paux2;3. Elemento e;4. if(*l==NULL){5. return e; 6. }7. paux1=*l;8. paux2=paux1->prox;9. do{10. if (paux2->e.codigo==codigo){11. break;12. }13. paux1=paux2;14. paux2=paux2->prox;15. }while(paux2!=*l);16. if(paux2->e.codigo!=codigo){17. // elemento não encontrado18. return e; //retorna e vazio;19. } 20. paux1->prox = paux2->prox;21. e = paux2->e;22. if(*l==paux2){ /* se o nodo procurado é o apontado por l*/23. if(paux1!=paux2){ /* lista com mais de um nodo */24. *l=paux1; 25. }26. else { /* lista com um so nodo */27. *l=NULL; 28. }29. } 30. free(paux2);31. return e;32. }

Page 9: Principais operações em Listas

Lista duplamente encadeada1. void insereNaLista(Lista *l, Elemento e){2. Lista p;3. p = malloc(sizeof(struct nodo));4. p->e = e;5. 6. if (*l==NULL){ /* Lista vazia */7. p->prox = p;8. p->ant=p;9. *l = p;10. } 11. else {12. (*l)->ant->prox=p;13. p->prox=(*l);14. p->ant=(*l)->ant;15. (*l)->ant=p;16. (*l)=p;17. } 18. }

Page 10: Principais operações em Listas

Remoção1. Elemento removeDaLista(Lista *l){2. Elemento e;3. Lista anterior, proximo;4. if(*l==NULL){ // lista vazia5. return e; 6. }7. if(*l==(*l)->ant) { // lista de um nodo somente8. e=(*l)->e;9. free(*l);10. *l=NULL;11. return e;12. }13. anterior=(*l)->ant;14. proximo = (*l)->prox;15. anterior->prox=proximo;16. proximo->ant=anterior;17. e=(*l)->e;18. free(*l);19. *l=proximo;20. return e;21. }

Page 11: Principais operações em Listas

1. Removendo elemento arbitrário.2. Elemento removeElemento(Lista *l, int codigo){3. Lista aeliminar, proximo,anterior;4. Elemento e;5. if(*l==NULL){ // 1.lista vazia6. return e; 7. }8. aeliminar = *l;9. do {10. if(aeliminar->e.codigo==codigo)11. break;12. aeliminar=aeliminar->prox;13. }while(aeliminar!=*l);14. if (aeliminar->e.codigo!=codigo){ // 2.elemento nao existe15. return e;16. }17. if ((*l)->ant==(*l)){ // 3. so um elemento na lista18. *l=NULL;19. return e;20. }21. else{22. anterior = aeliminar->ant;23. proximo = aeliminar->prox;24. anterior->prox=proximo;25. proximo->ant=anterior;26. if(aeliminar==*l){ // 4. se eliminar o elemento apontado por l atualizo l27. *l=proximo;28. }29. }30. e = aeliminar->e;31. free(aeliminar);32. return e;33. }