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