Você está na página 1de 4

// código lista circular simples

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

typedef struct node{


int v;
struct node *prox;
}Node;

typedef struct{
Node *inicio;
Node *fim;
int size;
}Lista;

void criarLista(Lista *lista){


lista -> inicio = NULL;
lista -> fim = NULL;
lista -> size = 0;
}

// Função para inserir dado no início


void addInicio(Lista *lista, int n){
Node *novo = (Node*)malloc(sizeof(Node));
if(novo){
novo -> v = n;
novo -> prox = lista -> inicio;
lista -> inicio = novo;
if(lista -> fim == NULL)
lista -> fim = novo;
lista -> fim -> prox = lista -> inicio;
lista -> size++;
}
else
printf("Erro ao alocar memoria!\n");
}

// Função para inserir dado no fim


void addFim(Lista *lista, int n){
Node *aux, *novo = (Node*)malloc(sizeof(Node));
if(novo){
novo -> v = n;
if(lista -> inicio == NULL){
lista -> inicio = novo;
lista -> fim = novo;
lista -> fim -> prox = lista -> inicio;
}
else{
lista -> fim -> prox = novo;
lista -> fim = novo;
}
lista -> size++;
}
else
printf("Erro ao alocar memoria!\n");
}

// função para remover um nó


Node* remove(Lista *lista, int n){
Node *aux, *remove = NULL;
if(lista -> inicio){
if(lista -> inicio == lista -> fim && lista -> inicio -> v == n){
remove = lista -> inicio;
lista -> inicio = NULL;
lista -> fim = NULL;
lista -> size--;
}
else if(lista -> inicio -> v == n){
remove = lista -> inicio;
lista -> inicio = remove -> prox;
lista -> fim -> prox = lista -> inicio;
lista -> size--;
}
else{
aux = lista -> inicio;
while (aux -> prox != lista -> inicio && aux -> prox -> v != n)
aux = aux -> prox;
if(aux -> prox -> v == n){
if(lista -> fim == aux->prox){
remove = aux -> prox;
aux -> prox = remove -> prox;
lista -> fim = aux;
}
else{
remove = aux -> prox;
aux -> prox = remove -> prox;
}
lista -> size--;
}
}
}

return remove;
}

// Função de busca de um valor


Node* search(Lista *lista, int n){
Node *aux = lista -> inicio;
if(aux){
do{
if(aux -> v == n)
return aux;
aux = aux -> prox;
}while(aux != lista -> inicio);
}
return NULL;
}

// Função para imprimir a lista circular


void printLista(Lista lista){
Node *node = lista.inicio;
printf("\n\tLista de tamanho %d: ", lista.size);
if(node){
do{
printf("%d ", node -> v);
node = node -> prox;
}while (node != lista.inicio);
}
printf("\n\n");
}

int main(){
int op, elem;
Lista lista;
Node *r;

criarLista(&lista);

do{
printf("Escolha uma opcao:\n 1 - inserir no inicio\n 2 - Inserir no fim\n 3
- Remover um valor\n 4 - Buscar\n 5 - Imprimir a lista\n 6 - Sair\n");
scanf("%d", &op);

switch(op){
case 1:
printf("Digite um valor: ");
scanf("%d", &elem);
addInicio(&lista, elem);
break;
case 2:
printf("Digite um valor: ");
scanf("%d", &elem);
addFim(&lista, elem);
break;
case 3:
printf("Digite um valor a ser removido: ");
scanf("%d", &elem);
r = remove(&lista, elem);
if(r){
printf("Elemento removido: %d\n", r -> v);
free(r);
}
else
printf("elemento inesistente!\n");
break;
case 4:
printf("Digite um valor a ser buscado: ");
scanf("%d", &elem);
r = search(&lista, elem);
if(r)
printf("Valor encontrado: %d\n", r -> v);
else
printf("Valor nao encontrado!\n");
break;
case 5:
printLista(lista);
break;
case 6:
printf("Finalizando...\n");
break;
default:
printf("Opcao invalida!\n");
}

}while(op != 6);

return 0;
}

Você também pode gostar