Lista Circular
#include <stdio.h>
#include <stdlib.h>
struct lista {
char dado;
struct lista *prox;
};
typedef struct lista TLista;
TLista* inicializa() {
return NULL;
}
void imprime(TLista *lista, TLista *aux) {
/*do {
printf("%c", aux->dado);
aux = aux->prox;
} while (aux != lista);
*/
/*if (aux->prox == lista) {
printf("%c", aux->dado);
} else {
imprime(lista, aux->prox);
printf("%c", aux->dado);
}*/
(aux->prox == lista) ? : imprime(lista, aux->prox),printf("%c", aux->dado);
}
int verifica(TLista *lista) {
return lista == NULL;
}
TLista* insere(char letra, TLista *lista) {
TLista *aux;
aux = (TLista*) malloc(sizeof(TLista));
aux->dado = letra;
if (lista) {
TLista *aux2 = lista;
aux->prox = lista;
do {
aux2 = aux2->prox;
} while (aux2->prox != lista);
aux2->prox = aux;
} else
aux->prox = aux;
return aux;
}
TLista* busca(TLista *lista, char letra, TLista *aux) {
/*if ((lista->dado == letra) || (lista->prox == aux)) {
return lista;
} else {
return busca(lista->prox, letra, aux);
}*/
return (lista->dado == letra) || (lista->prox == aux) ? lista : busca(lista->prox, letra, aux);
}
TLista* remover(TLista *lista, char letra) {
TLista * aux = lista->prox, *aux2;
if (lista->prox == lista) {
free(lista);
return inicializa();
} else {
do {
if (aux->prox->dado == letra) {
aux2 = aux->prox;
free(aux2);
aux->prox = aux->prox->prox;
}
aux = aux->prox;
} while (aux->dado != lista->prox->dado);
}
return aux;
}
int main(void) {
setbuf(stdout, NULL);
TLista *lista;
lista = insere('T', inicializa());
lista = insere('E', lista);
lista = insere('S', lista);
lista = insere('T', lista);
lista = insere('E', lista);
if (busca(lista, 'X', lista)->dado == 'X') {
printf("Achou!\n");
lista = remover(lista, 'X');
} else
printf("N�o Achou!\n");
if (verifica(lista)) {
printf("A lista est� vazia\n");
} else
printf("A lista n�o est� vazia\n");
imprime(lista, lista);
return 0;
}
Lista Dinâmica
#include <stdio.h>
#include <stdlib.h>
struct lista {
char dado;
struct lista *prox;
};
typedef struct lista TLista;
TLista* insere(char letra, TLista *lista) {
TLista *aux;
aux = (TLista*) malloc(sizeof(TLista));
aux -> dado = letra;
aux -> prox = lista;
return aux;
}
/*void imprime(TLista *lista){
TLista *aux;
aux = lista;
while(aux != NULL){
printf("%c\n",aux->dado);
aux = aux -> prox;
}
}*/
void imprimerec(TLista *lista) {
if (lista) {
//printf("%c\n",lista->dado);
imprimerec(lista->prox);
printf("%c\n", lista->dado);
}
}
TLista* inicializa(void) {
return NULL;
}
int verifica(TLista *lista) {
return lista == NULL;
}
/*
int verifica2(TLista *lista) {
if (lista == NULL) {
return 1;
} else
return 0;
}
main:
if (verifica2(lista)) {
printf("\nA lista est� vazia");
} else
printf("\nA lista n�o est� vazia");
*/
TLista* procura(char letra, TLista *lista) {
//Recursivo
if ((lista == NULL) || (lista->dado == letra))
return lista;
else
return procura(letra, lista->prox);
/*
Iterativo
TLista *aux;
for (aux = lista; aux != NULL; aux = aux -> prox) {
if (aux->dado == letra) {
return aux;
}
}
return aux;
*/
}
TLista* removeinicio(TLista *lista) {
free(lista);
return lista = lista->prox;
}
TLista* removequalquer(TLista *lista, char letra) {
TLista* aux;
if (lista) {
if (lista->dado == letra) {
return removeinicio(lista);
} else if (lista->prox) {
if (lista->prox->dado == letra) {
aux = lista->prox;
lista->prox = lista->prox->prox;
free(aux);
} else
removequalquer(lista->prox, letra);
}
}
return lista;
}
/*
TLista* removequalquer(TLista *lista, char letra) {
if (lista) {
removequalquer(lista->prox, letra);
if (lista->prox) {
if (lista->prox->dado == letra) {
free(removequalquer(lista->prox, letra));
lista->prox = lista->prox->prox;
}
}
}
return lista;
}
*/
TLista* liberarec(TLista* lista) {
if (lista) {
return liberarec(lista->prox);
free(lista);
}
return lista;
}
/*TLista* libera(TLista* lista){
while(lista){
lista = lista->prox;
free(lista);
}
return lista;
}*/
int main(void) {
setbuf(stdout, NULL);
/* Tlista *no1;
Tlista *no2;
Tlista *no3;
no1 = (Tlista*) malloc(sizeof(Tlista));
no1 -> dado = 'F';
no1 -> prox = NULL;
no2 = (Tlista*) malloc(sizeof(Tlista));
no2 -> dado = 'U';
no2 -> prox = no1;
no3 = (Tlista*) malloc(sizeof(Tlista));
no3 -> dado = 'M';
no3 -> prox = no2;
printf("%c - %c - %c\n", no3->dado, no3->prox->dado,no3->prox->prox->dado);
*/
TLista *lista;
lista = insere('F', inicializa());
lista = insere('U', lista);
lista = insere('M', lista);
lista = insere('E', lista);
lista = insere('C', lista);
imprimerec(lista);
if (verifica(lista)) {
printf("\nA lista est� vazia");
} else
printf("\nA lista n�o est� vazia");
char letra;
printf("\n\nDigite a letra a ser procurada: ");
fflush(stdin);
scanf("%c", &letra);
if (procura(letra, lista)) {
printf("Achou\n");
} else
printf("N�o Achou\n");
//imprimerec(removeinicio(letra, lista));
printf("\n");
imprimerec(removequalquer(lista, letra));
if (verifica(liberarec(lista))) {
printf("\nA lista est� vazia");
}
return 0;
}
Lista Duplamente Encadeada
#include <stdio.h>
#include <stdlib.h>
typedef struct lista TLista2;
struct lista{
char dado;
TLista2 *prox;
TLista2 *ant;
};
TLista2* inicializa(void){
return NULL;
}
int verifica(TLista2 *lista){
return (lista == NULL);
}
TLista2* insere(TLista2 *lista, char ch){
TLista2 *aux;
aux = (TLista2*) malloc(sizeof(TLista2));
aux->dado = ch;
aux->prox = lista;
aux->ant = inicializa();
if(lista)
lista->ant = aux;
return aux;
}
void imprime(TLista2 *lista){
TLista2 *aux;
aux = lista;
while(aux){
printf("%c\n", aux->dado);
aux = aux->prox;
}
}
void imprimerec(TLista2 *lista){
if(!verifica(lista)){
imprimerec(lista->prox);
printf("%c\n", lista->dado);
}
}
int busca(TLista2 *lista, char letra) {
//ITERATIVO
/*do{
if(lista->dado == letra)
return lista;
lista = lista->prox;
}while(lista);
return lista;*/
//RECURSIVO
/*
if(!lista || lista->dado == letra){
return lista;
}else
return busca(lista->prox,letra);
*/
//RECURSIVO TERN�RIO
//return (!lista || lista->dado == letra) ? lista : busca(lista->prox,letra);
//RECURSIVO L�GICO
return (lista) && ((lista->dado == letra) || (busca(lista->prox,letra)));
}
TLista2* removeinicio(TLista2 *lista) {
free(lista);
return lista = lista->prox;
}
TLista2* removequalquer(TLista2 *lista, char letra) {
TLista2* aux;
if (lista) {
if (lista->dado == letra) {
return removeinicio(lista);
} else if (lista->prox) {
if (lista->prox->dado == letra) {
aux = lista->prox;
lista->prox = lista->prox->prox;
free(aux);
} else
removequalquer(lista->prox, letra);
}
}
return lista;
}
int main(void) {
setbuf(stdout, NULL);
TLista2 *lista2x;
lista2x = inicializa();
lista2x = insere(lista2x, 'T');
lista2x = insere(lista2x, 'E');
lista2x = insere(lista2x, 'S');
lista2x = insere(lista2x, 'T');
lista2x = insere(lista2x, 'E');
/*if (busca(lista2x,'T')) {
printf("Achou!\n\n");
} else
printf("N�o Achou!\n\n");
*/
busca(lista2x,'X') ? printf("Achou!\n\n") : printf("N�o Achou!\n\n");
printf("%c\n", lista2x->prox->prox->prox->ant->ant->dado);
printf("---------------------------\n");
imprime(lista2x);
printf("---------------------------\n");
imprimerec(lista2x);
printf("\n---------------------------\n");
imprimerec(removequalquer(lista2x, 'S'));
return 0;
}
Lista Duplamente Encadeada Circular
#include <stdio.h>
#include <stdlib.h>
typedef struct lista TLista;
struct lista {
char dado;
TLista *prox;
TLista *ant;
};
TLista* inicializa(void){
return NULL;
}
TLista* insere(char letra, TLista *lista) {
TLista *aux;
aux = (TLista*) malloc(sizeof(TLista));
aux->dado = letra;
if (!lista){
aux->prox = aux;
aux->ant = aux;
} else {
TLista* cont = lista->prox;
TLista* cont2 = lista->ant;
do {
cont = cont->prox;
cont2 = cont2->ant;
} while (cont->dado != lista->prox->dado);
aux->prox = cont;
aux->ant = cont2;
lista->prox = aux;
lista->ant = aux;
}
return aux;
}
void imprimir(TLista *lista, TLista *cont) {
do {
printf("%c", cont->dado);
cont = cont->prox;
} while (cont != lista);
}
void imprime(TLista *lista) {
while(lista){
printf("\n%c", lista->dado);
lista = lista->prox;
}
}
TLista* busca(TLista *lista, char letra, TLista *aux){
if ((lista->dado == letra) || (lista->prox == aux)){
return lista;
} else {
return busca(lista->prox, letra, aux);
}
}
TLista* removedado(TLista *lista, char letra){
TLista *aux = lista->prox, *del;
if (lista->prox == lista){
free(lista);
return inicializa();
} else {
do {
//printf("\n---\n %c - %c \n---\n", aux->prox->dado, letra);
if (aux->prox->dado == letra){
del = aux->prox;
aux->prox = aux->prox->prox;
free(del);
}
aux = aux->prox;
} while (aux->dado != lista->prox->dado);
}
return aux;
}
int main(void) {
TLista *lista;
setbuf(stdout, NULL);
lista = inicializa();
lista = insere('T', lista);
lista = insere('E', lista);
lista = insere('S', lista);
lista = insere('T', lista);
lista = insere('E', lista);
//printf("%c", lista->prox->dado);
imprimir(lista->prox, lista);
imprime(lista);
if(busca(lista, 'F', lista)->dado == 'F'){
printf("\n\nLetra Encontrada - %c", busca(lista, 'F', lista)->dado);
} else {
printf("\n\nLetra N�o Encontrada");
}
printf("\n\n---- Remove Dado ----");
/*lista = removedado(lista, 'F');
if (lista){
printf("\nDado removido com sucesso!\n");
imprimir(lista, lista);
} else {
printf("\nLista Vazia");
}*/
return 0;
}