Você está na página 1de 17

Lista Circular Encadeada

Trabalho : Lista Circular Encadeada em C.

Alunos: Endrigo Ricardo 76088 Mariane Bergamini 67075 Maykon David 76971

Professor: Fernando Meneccheli

VOTUPORANGA 2011

Lista Circular Encadeada


-

Listas Encadeadas Estrutura de uma lista encadeada Busca em uma lista encadeada Insero em uma lista encadeada Remoo em uma lista encadeada

Lista Circular Encadeada


dinmica pois utiliza ponteiro; No limitada pois trabalha com endereos; Possui nos que so ligados entre si (indicao da relao de ordem entre eles); Cada n dever possuir a sua indicao e uma outra indicao para o outro n.

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.

Listas Lineares em Alocao encadeada

#include <stdio.h> #include <stdlib.h> #include <conio.h>

structno { //tipo de dados int info; struct no *prox; };

//bibliotecas declaradas para que o sistema funcione corretamente //criando registro no e

amarrando com o prox //ou seja a celula

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;

//criando um n na lista. //verificao se h espao suficiente na memria

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;

pt = cria_no(); pt->info = pt->prox = ant->prox = pt; }

//seno receber os dados

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