Escolar Documentos
Profissional Documentos
Cultura Documentos
Listas Lineares
Listas Lineares
Adequadas quando no possvel prever a demanda por memria, permitindo a manipulao de quantidades imprevisveis de dados, de formato tambm imprevisvel. So teis em aplicaes tais como manipulao simblica, gerncia de memria, simulaes e compiladores.
Algoritmos e Estrutura de Dados II
Sua principal propriedade estrutural envolve as posies relativas dos itens em uma dimenso.
e xn o ltimo item
da lista.
xi precede xi+1 para i = 1,2,,n 1 xi sucede xi-1 para i = 2,3,,n o elemento xi dito estar na i-sima posio da lista.
Algoritmos e Estrutura de Dados II
O conjunto de operaes a ser definido depende de cada aplicao. Um conjunto de operaes necessrio a uma maioria de aplicaes :
1) 2) 3) 4)
5) 6) 7) 8)
9)
Criar uma lista linear vazia. Inserir um novo item imediatamente aps o i-simo item. Retirar o i-simo item. Localizar o i-simo item para examinar e/ou alterar o contedo de seus componentes. Combinar duas ou mais listas lineares em uma lista nica. Partir uma lista linear em duas ou mais listas. Fazer uma cpia da lista linear. Ordenar os itens da lista em ordem ascendente ou descendente, de acordo com alguns de seus componentes. Pesquisar a ocorrncia de um item com um valor particular em algum componente.
Algoritmos e Estrutura de Dados II
Vrias estruturas de dados podem ser usadas para representar listas lineares, cada uma com vantagens e desvantagens particulares. As duas representaes mais utilizadas so as implementaes por meio de arranjos e de apontadores. Exemplo de Conjunto de Operaes:
1)
2) 3)
4) 5)
Os itens da lista so armazenados em posies contguas de memria. A lista pode ser percorrida em qualquer direo. A insero de um novo item pode ser realizada aps o ltimo item com custo constante. A insero de um novo item no meio da lista requer um deslocamento de todos os itens localizados aps o ponto de insero. Retirar um item do incio da lista requer um deslocamento de itens para preencher o espao deixado vazio.
Algoritmos e Estrutura de Dados II
0 1000
Vantagem:
economia de memria (os apontadores so implcitos nesta estrutura). Acesso a um item qualquer O(1).
Desvantagens:
custo para inserir ou retirar itens da lista, que pode causar um deslocamento de todos os itens, no pior caso; em aplicaes em que no existe previso sobre o crescimento da lista, a utilizao de arranjos em linguagens como o Pascal pode ser problemtica porque neste caso o tamanho mximo da lista tem de ser definido em tempo de compilao.
Algoritmos e Estrutura de Dados II
Cada item encadeado com o seguinte mediante uma varivel do tipo Apontador.
Permite utilizar posies no contguas de memria. possvel inserir e retirar elementos sem necessidade de deslocar os itens seguintes da lista.
typedef struct { TipoChave Chave; /* outros componentes */ } TipoItem; typedef struct Celula { TipoItem Item; struct Celula * Prox; } Celula; typedef struct Celula * Apontador; typedef struct { Apontador Primeiro, Ultimo; } TipoLista;
Algoritmos e Estrutura de Dados II
Apontador q;
if (Vazia(*L) || p == NULL || p->Prox == NULL) { printf(" Erro: Lista vazia posio no existe"); return; } q = p->Prox; *Item = q->Item; p->Prox = q->Prox; if (p->Prox == NULL) L->Ultimo = p; free(q);
}
Algoritmos e Estrutura de Dados II
Vantagens:
Permite inserir ou retirar itens do meio da lista a um custo constante (importante quando a lista tem de ser mantida em ordem). Bom para aplicaes em que no existe previso sobre o crescimento da lista (o tamanho mximo da lista no precisa ser definido a priori).
Desvantagem:
Utilizao de memria extra para armazenar os apontadores. O(n) para acessar um item no pior caso
Num vestibular, cada candidato tem direito a trs opes para tentar uma vaga em um dos sete cursos oferecidos. Para cada candidato lido um registro:
Problema: distribuir os candidatos entre os cursos, segundo a nota final e as opes apresentadas por candidato. Em caso de empate, os candidatos sero atendidos na ordem de inscrio para os exames.
Ordenar registros pelo campo NotaFinal, respeitando a ordem de inscrio; Percorrer cada conjunto de registros com mesma NotaFinal, comeando pelo conjunto de NotaFinal 10, seguido pelo de NotaFinal 9, e assim por diante. Para um conjunto de mesma NotaFinal tenta-se encaixar cada registro desse conjunto em um dos cursos, na primeira das trs opes em que houver vaga (se houver).
Primeiro refinamento:
program Vestibular ; begin ordena os registros pelo campo NotaFinal ; for Nota := 10 downto 0 do while houver registro com mesma nota do if existe vaga em um dos cursos de opcao do candidato then insere registro no conjunto de aprovados else insere registro no conjunto de reprovados; imprime aprovados por curso ; imprime reprovados; end.
Uma boa maneira de representar um conjunto de registros com o uso de listas. Ao serem lidos, os registros so armazenados em listas para cada nota. Aps a leitura do ltimo registro os candidatos esto automaticamente ordenados por NotaFinal. Dentro de cada lista, os registros esto ordenados por ordem de inscrio, desde que os registros sejam lidos na ordem de inscrio de cada candidato e inseridos nesta ordem.
As listas de registros so percorridas, iniciando-se pela de NotaFinal 10, seguida pela de NotaFinal 9, e assim sucessivamente. Cada registro retirado e colocado em uma das listas da abaixo, na primeira das trs opes em que houver vaga. Aps a leitura do ltimo registro os candidatos esto automaticamente ordenados por NotaFinal. Dentro de cada lista, os registros esto ordenados por ordem de inscrio, desde que os registros sejam lidos na ordem de inscrio de cada candidato e inseridos nesta ordem.
Se no houver vaga, o registro colocado em uma lista de reprovados. Ao final a estrutura acima conter a relao de candidatos aprovados em cada curso.
typedef short TipoChave; typedef struct TipoItem { TipoChave Chave; char NotaFinal; char Opcao[NOpcoes]; } TipoItem; typedef struct Celula { TipoItem Item; struct Celula *Prox; } Celula;
Observe que o programa completamente independente da implementao do tipo abstrato de dados Lista.
void LeRegistro(TipoItem *Registro) { /*---os valores lidos devem estar separados por brancos---*/ long i; int TEMP; scanf("%hd%d", &Registro->Chave, &TEMP); Registro->NotaFinal = TEMP; for (i = 0; i < NOpcoes; i++) { scanf("%d", &TEMP); Registro->Opcao[i] = TEMP; } scanf("%*[^\n]"); getchar(); }
O exemplo mostra a importncia de utilizar tipos abstratos de dados para escrever programas, em vez de utilizar detalhes particulares de implementao. Altera-se a implementao rapidamente. No necessrio procurar as referncias diretas s estruturas de dados por todo o cdigo. Este aspecto particularmente importante em programas de grande porte.