Principais operações em Listas
TPA - 2009-2
Listas Simples
Inserção no Final
1. 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. }
Insere no final da lista Recursivamente
1. 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.
else
8.
insereNofinalDaLista( &((*l)->prox), e);
9. }
10.
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. }
Remove da Lista um elemento arbitrário
1. 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. }
Lista Circular
Inserção
1. 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. }
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. }
Remoção de elemento arbitrário
1.
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 encontrado
18.
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.
}
Lista duplamente encadeada
1. 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. }
Remoção
1. Elemento removeDaLista(Lista *l){
2. Elemento e;
3. Lista anterior, proximo;
4.
if(*l==NULL){ // lista vazia
5.
return e;
6.
}
7.
if(*l==(*l)->ant) { // lista de um nodo somente
8.
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. }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Removendo elemento arbitrário.
Elemento removeElemento(Lista *l, int codigo){
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;
}
Download

Listas