Você está na página 1de 4

#include <stdio.

h>
#include <stdlib.h>
typedef struct no {
int valor;
struct no *proximo;
} No;
typedef struct {
No *inicio;
No *fim;
int tam;
} Lista;
void criarlista (Lista *lista) {
lista -> inicio = NULL;
lista -> fim = NULL;
lista -> tam = 0;
}
void inseririnicio (Lista *lista, int num) {
No *novo = malloc(sizeof(No));
if (novo) {
novo -> valor = num;
novo -> proximo = lista -> inicio;
lista->inicio = novo;
if (lista -> fim == NULL)
lista -> fim = novo;
lista -> fim -> proximo = lista -> inicio;
lista -> tam++;
} else
printf ("Memória não foi alocada\n");
}
void inserirfim (Lista *lista, int num) {
No *aux, *novo = malloc(sizeof(No));
if (novo) {
novo -> valor = num;
if (lista -> inicio == NULL) {
lista -> inicio = novo;
lista -> fim = novo;
lista -> fim-> proximo = lista -> inicio;
} else {
lista -> fim -> proximo = novo;
lista -> fim = novo;
lista -> fim -> proximo = lista -> inicio;
}
lista -> tam++;
} else {
printf("Problemas para alocar a memória\n");
}
}
void inserirordenado (Lista *lista, int num) {
No *aux, *novo = malloc (sizeof(No));
if (novo) {
novo -> valor = num;
if (lista -> inicio == NULL) {
inseririnicio (lista, num);
} else if (novo -> valor < lista -> inicio -> valor) {
inseririnicio (lista, num);
} else {
aux = lista -> inicio;
while (aux -> proximo != lista -> inicio && novo -> valor > aux
-> proximo -> valor)
aux = aux -> proximo;
if (aux -> proximo == lista -> inicio)
inserirfim (lista, num);
else {
novo -> proximo = aux -> proximo;
aux -> proximo = novo;
lista -> tam++;
}
}
} else {
printf("Problemas para alocar a memória\n");
}

No *remover(Lista *lista, int num) {


No *aux, *remover = NULL;

if (lista -> inicio) {


if (lista -> inicio == lista -> fim && lista -> inicio -> valor ==
num) {
remover = lista -> inicio;
lista -> inicio = NULL;
lista -> fim = NULL;
lista -> tam--;

} else if (lista -> inicio -> valor == num) {


remover = lista -> inicio;
lista -> inicio = remover -> proximo;
lista -> fim -> proximo = lista -> inicio;
lista -> tam--;

} else {
aux = lista -> inicio;
while (aux -> proximo != lista -> inicio && aux -> proximo ->
valor != num)
aux = aux -> proximo;
if (aux -> proximo -> valor == num) {
if (lista -> fim == aux -> proximo) {
remover = aux -> proximo;
aux -> proximo = remover -> proximo;
lista -> fim = aux;

} else {
remover = aux -> proximo;
aux -> proximo = remover -> proximo;
}
lista -> tam--;
}
}
}
return remover;
}
No *buscar(Lista *lista, int num) {
No *aux = lista -> inicio;
if (aux) {
do {
if (aux -> valor == num)
return aux;
aux = aux -> proximo;
} while (aux != lista -> inicio);
}
return NULL;
}
void *alterar(Lista *lista, int num) {
No *alterar = buscar (lista, num);
int novovalor;
if(alterar){
printf ("Coloque valor para alterar %d:", alterar->valor);
scanf ("%d", &novovalor);
alterar -> valor = novovalor; printf("\tAlterado"); }
else{
printf ("Não encontrado");
}
}
void imprimir (Lista lista) {
No *no = lista.inicio;
printf("\nTamanho da lista: %d", lista.tam);
printf("\nLista: ");
if (no) {
do {
printf ("%d", no -> valor);
no = no -> proximo;
} while (no != lista.inicio);
printf ("\nInicio: %d\n", no -> valor);
}
printf ("\n");
}
int main() {
int opcao, valor, anterior;
Lista lista;
No *removido;
criarlista (&lista);
do {
printf("\n\t0 - Sair\n\t1 - Inserir no inicio\n\t2 - Inserir no fim\
n\t3 - Inserir ordenado\n\t4 - Remover\n\t5 - Buscar\n\t6 - Alterar\n\t7 -
Imprimir");
printf ("\n\tOpção:");
scanf("%d", &opcao);
switch (opcao) {
case 1:
printf ("Coloque um valor: ");
scanf ("%d", &valor);
inseririnicio (&lista, valor);
break;
case 2:
printf ("Coloque um valor: ");
scanf ("%d", &valor);
inserirfim (&lista, valor);
break;
case 3:
printf("Digite um valor: ");
scanf("%d", &valor);
inserirordenado (&lista, valor);
break;
case 4:
printf("Coloque o valor que será removido: ");
scanf("%d", &valor);
removido = remover (&lista, valor);
if (removido) {
printf ("Elemento que será removido: %d\nRemovido",
removido -> valor);
free (removido);
}else
printf("Não existe");
break;
case 5:
printf ("Coloque o valor que deseja buscar: ");
scanf ("%d", &valor);
removido = buscar(&lista, valor);
if (removido)
printf ("Encontrado: %d\n", removido -> valor);
else
printf ("Não encontrado");
break;
case 6:
printf ("Coloque o valor que será alterado: ");
scanf ("%d", &valor);
alterar (&lista, valor);
break;
case 7:
imprimir (lista);
break;
break;
default:
if (opcao != 0)
printf ("Inválida!");
}
} while (opcao != 0);
return 0;
}

Você também pode gostar