Alunos: Endrigo Ricardo 76088 Mariane Bergamini 67075 Maykon David 76971
VOTUPORANGA 2011
Listas Encadeadas Estrutura de uma lista encadeada Busca em uma lista encadeada Insero em uma lista encadeada Remoo em uma lista encadeada
encadeada
- Operaes em listas implementadas com alocao seqencial so muito fracas; - Na utilizao de mais de duas listas, a gerncia de memria mais complexa usar alocao dinmica (ou alocao encadeada). Na alocao encadeada, as posies de memria so alocadas (ou desalocadas) na medida em que so necessrias (ou dispensadas). Os ns de uma lista encontram-se aleatoriamente dispostos na memria e so interligados por ponteiros, que indicam a posio do prximo elemento da tabela. Cada n ter, agora, um campo adicional, que conter o endereo do prximo n da lista.
struct no *cria_no() { struct no *pt; if (( pt = (struct no *) malloc(sizeof(struct no)) ) == NULL ) { puts(" - Puta que pariu velho, no temos temos espaco eim!!! - "); exit(1); } pt->info = -1; pt->prox = NULL; return pt;
void inserir (struct no *ptlista, int valor) { struct no *pont, *ant, *pt; ant = ptlista; pont = ptlista->prox; while (pont->info < valor) { ant = pont; pont = pont>prox; if (pont->info == valor && pont != ptlista){ printf(" - Este dado ja est contido no sistema - "); getch();}
// procedimento inserir // registro n com 3 ponteiros // inicializao da busca circular // ant recebe ptlista, pont recebe ptlista na pos //ptlista na posio info recebe valor io prox //enquanto ponteiro na posio info for menor do que o valor armazenado //o ponteiro ant recebe pont e pont recebe pont na posio prox //comparao do valor que esta em ponteiro na posio info = valor e //ponteiro for diferente de ptlista //retorna que o dado ja contm no sistema
else {
valor;
pont;
void remover (struct no *ptlista, int valor) { struct no *pont, *ant; ptlista->info = valor; while (pont->info < valor) { if (pont->info < valor) { ant = pont; pont = pont->prox; } }
// procedimento de remoo //declarao dos ponteiros pont e ant dentro do registro n // ant recebe ptlista, pont recebe ptlista na posio prox //ptlista na posio info recebe valor //enquanto o ponteiro na posio info for menor que o valor //ponteiro ant recebe pont, pont recebe pont na posio prox
if (pont->info == valor && pont != ptlista) { ant->prox = pont->prox; free(pont); } else{ printf(" - O valor nao consta no sistema "); getch();} }
// se pont na posio info for igual ao valor e pont for diferente de ptlista //o free pont limpa o que contm armazenado na posio //seno no ha valores no sistema
void apresentar (struct no *ptlista) { clrscr(); if (ptlista->info==-1){ printf(" - O Sistema nao contem informacoes "); getch(); } else{ int i=0; struct no *pont; pont = ptlista>prox;
//procedimento apresentar //compara se ptlista na posio info igual a -1 //se for -1 significa que no foi cadastrado nenhum Dado, ou seja, as posies //ainda no foram alteradas //seno o contador i comeando em 0
while (pont != ptlista) { printf(" Valor armazenado %d = %d\n", i++, pont->info); pont = pont>prox; } getch();} }
//enquanto pont for diferente de ptlista //mostrar na tela a posio e a informao gravada //o getch finaliza o procedimento de apresentar
void main() { struct no *ptlista; int valor; char opc; ptlista = cria_no(); ptlista->prox=ptlista; do { clrscr();
printf("Lista Circular\n\n\n\n - Digite a opcao desejada:\n\n1 --> Inserir\n2 --> Remover\n3 --> Apresentar\n0 --> Sair\n"); scanf("%s",&opc); switch (opc) {
case '1': clrscr(); printf("<><><><> Qual dado a inserir? <><><><>\n"); scanf("%d",&valor); inserir(ptlista, valor); break; case '2': clrscr(); puts("<><><><> Qual dado a remover? <><><><>\n"); scanf("%d", &valor); remover(ptlista, valor); break; case '3': apresentar(ptlista); break; case '0': break; default:clrscr(); printf("<><><><> Opcao invalida <><><><>"); getch(); break; } } while (opc!='0');
Bibliografia:
http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html
http://www.inf.pucrs.br/~ pinho/LaproI/Funcoes/AulaDeFuncoes.htm