Uploaded by P P

listas ligadas simples em C

advertisement
Programação de Computadores II
Paulo Cortez
2005/2006
Licenciatura em Engenharia Electrónica e
Computadores
http://www.dsi.uminho.pt/disciplinas/EIPCII
Paulo Cortez
Programação de Computadores II
Aula 8: Listas Ligadas
Objectivos:
Manipular estruturas de dados envolvendo listas ligadas;
Paulo Cortez
Programação de Computadores II
Listas Ligadas: conceitos básicos
L
data
1
next
data
data
next
3
next
NULL
2
Estrutura dinâmica para dados sequenciais, organizados por
nós.
Mais eficiente para um uso intensivo de inserções e remoções.
Menos eficiente para aceder a um dado elemento: O(n).
Lista vazia, não tem nós (NULL)
Declaração de lista (aponta para o 1o nodo): LIST *l;
Paulo Cortez
Programação de Computadores II
Operações
list empty(l) - verifica se a lista está vazia. O(1)
list size(l) - devolve o número de elementos da lista.
O(n)
list insert head(l,elem) - insere elem no inı́cio da lista.
O(1)
list insert sort(l,elem) - insere elem na lista, de forma
ordenada. O(n)
list insert end(l,elem) - insere elem no fim da lista.
O(n)
list remove(l,elem) - remove elem da lista. O(n)
list member(l,elem) - verifica se elem pertence à lista.
O(n)
list destroy(l) - destroi a lista. O(n)
list print(l) - imprime a lista. O(n)
Paulo Cortez
Programação de Computadores II
Codificação em C
typedef struct list{ int data; struct list* next;}
LIST;
int list empty(LIST *l)
{ if(l==NULL) return 1; else return 0;}
void list print(LIST *l)
{ if(l!=NULL)
{ printf(‘‘%d ‘‘,l->data); list print(l->next);}
else printf(‘‘\n’’);
}
void list print2(LIST *l)
{ while(l!=NULL)
{ printf(‘‘%d ‘‘,l->data); l=l->next;}
printf(‘‘\n’’);
}
Paulo Cortez
Programação de Computadores II
LIST *list insert head(LIST *l, int elem)
{ LIST *res=(LIST*)malloc(sizeof(LIST));
res->data=elem;
res->next=l;
return res;
}
LIST *list insert end(LIST *l, int elem)
{ LIST *res, *aux;
if(l==NULL) res= list insert head(l,elem);
else { aux=list insert end(l->next, elem);
l->next=aux;
res=l;}
return res;
}
Paulo Cortez
Programação de Computadores II
LIST *list insert end2(LIST *l, int elem)
{ LIST *aux=l; LIST *res=(LIST*)malloc(sizeof(LIST));
res->data=elem;res->next=NULL;
if(aux!=NULL)
{ while(aux->next!=NULL)aux=aux->next;
aux->next=res; return l;}
else {return res;}
}
LIST *list insert sort(LIST *l, int elem)
{ LIST *prev, *aux, *act;
aux=list insert head(l,elem);
prev=NULL;act=l;
while(act!=NULL && act->data<elem)
{ prev=act; act=act->next;}
aux->next=act;
if(prev==NULL) return aux;
else { prev->next=aux; return l;}
}
Paulo Cortez
Programação de Computadores II
LIST *list remove(LIST *l, int elem)
{ LIST *res, *aux;
if(l==NULL) return l;
if(l->data==elem) { res=l->next; free(l);}
else {aux=list remove(l->next,elem);
l->next=aux; res=l;}
return res;
}
LIST *list destroy(LIST *l)
{ LIST aux;
while(l!=NULL)
{aux=l;l=l->next;free(aux);}
}
Paulo Cortez
Programação de Computadores II
Download