Escolar Documentos
Profissional Documentos
Cultura Documentos
Estruturas Compostas
Estruturas Compostas
typedef struct tp_no { int cod; float preco; int quant; struct tp_no *prox; } TPLISTA; TPLISTA *lista; ... lista->cod=1; lista->preco=10.5; lista->quant=20;
Ns de Cabealho
N adicional no incio da lista que substitui o ponteiro para a lista A parte INFO pode ficar sem uso ou armazenar alguma informao global da lista, como o nmero de ns Se o campo INFO do cabealho no for do mesmo tipo que o resto da lista, ser necessrio criar outra estrutura para ele
6 9 7 3 6 9 7
Listas Circulares
O ltimo elemento tem como prximo o primeiro elemento da lista, formando um ciclo til quando:
A rigor no existe "primeiro" ou "ltimo" Ainda necessrio que exista um ponteiro para algum elemento, para a localizao da lista
Listagem
void listagem (tplista *t) { tplista *p=t; if (t!=NULL) do { printf("Info: %d", p->info); p=p->prox; } while (p!=t); else printf("Lista Circular vazia!"); }
Lista Circular
Insero? Remoo?
8
Por definio, uma Lista Circular no tem primeiro nem ltimo elemento Uma conveno til para implementar Pilhas fazer o ponteiro apontar para o ltimo elemento Neste caso, o n seguinte ao ponteiro da Pilha ser o n do topo:
PL
10
til quando preciso percorrer a lista na ordem inversa Remoo de um elemento no precisa guardar anterior Remoo de um elemento cujo ponteiro informado no precisar percorrer a fila toda Um conjunto maior de ligaes precisam ser atualizadas
11
Cada n possui dois ponteiros: um para o elemento anterior e outro para o prximo elemento (ant e prox)
ant prox
lista
a
12
typedef struct tp_no { tpitem info; struct tp_no *ant; struct tp_no *prox; } tplista; tplista *lista;
13
Busca e Listagem
Busca e Listagem:
14
Insero no Incio
O novo elemento encadeado no incio da lista O seu prximo passa a ser o antigo primeiro elemento e o seu anterior NULL
Se a lista no estiver vazia, o anterior do o antigo primeiro passa a ser o novo elemento
O ponteiro da lista passado por referncia e atualizado para apontar para o novo n A funo retornar 1 ou zero indicando o sucesso da incluso
lista
15
Insero no Incio
int inseredupla_inicio (tplista **t, int valor) { tplista *novo; novo = aloca(sizeof(tplista)); if (!novo) return 0; else { novo->info = valor; novo->prox = *t; novo->ant = NULL; if ( (*t)!=NULL ) (*t)->ant=novo; (*t)=novo; } }
16
Remoo
17
A remoo mais trabalhosa, pois preciso acertar a cadeia nos dois sentidos Em compensao, pode-se retirar um elemento conhecendo-se apenas o ponteiro para ele Utiliza-se uma funo de busca para localizar o elemento e em seguida o encadeamento ajustado Ao final, o elemento liberado
Remoo
Sendo p o ponteiro para o elemento a ser excludo, se o elemento estiver no meio da lista, devemos fazer:
p->ant->prox = p->prox; p->prox->ant = p->ant;
18
se p for o primeiro, no se pode referenciar p->ant, pois ele NULL; o mesmo acontece para p->prox quando o ltimo alm disso, se for o primeiro, preciso atualizar o ponteiro da lista
Remoo
lista p
lista
19
Remoo
Cdigo?
No Laboratrio!!
20
Cada n possui dois ponteiros: um para o elemento anterior e outro para o prximo elemento (ant e prox) O anterior do primeiro o ltimo e o prximo do ltimo o primeiro
a
lista
22