Skip to content

Instantly share code, notes, and snippets.

@joffilyfe
Created June 7, 2015 12:38
Show Gist options
  • Save joffilyfe/d2560d70134c9260e0f8 to your computer and use it in GitHub Desktop.
Save joffilyfe/d2560d70134c9260e0f8 to your computer and use it in GitHub Desktop.
Lista encadeada (será que tá certo?)
#include <stdio.h>
#include <stdlib.h>
// Estruturas
typedef struct caixa {
int dado;
struct caixa *proximaCaixaPonteiro;
} Caixa;
typedef Caixa *PonteiroParaInicio;
// Funções
void inicializaLista(PonteiroParaInicio *l);
int inserindoCaixa(PonteiroParaInicio *l, int valor);
void mostrarLista(PonteiroParaInicio l);
int procuraItem(PonteiroParaInicio l, int procurado);
int removendoCaixa(PonteiroParaInicio *l, int valor);
// MAIN
int main(void) {
int existe = 0;
PonteiroParaInicio lista;
inicializaLista(&lista);
inserindoCaixa(&lista, 1);
inserindoCaixa(&lista, 2);
inserindoCaixa(&lista, 3);
mostrarLista(lista);
// existe = procuraItem(lista, 1);
// printf("Existe (1 = sim): %d\n", existe);
// removendoCaixa(&lista, 3);
// printf("===============\n");
// mostrarLista(lista);
removendoCaixa(&lista, 2);
mostrarLista(lista);
return 0;
}
int removendoCaixa(PonteiroParaInicio *l, int valor) {
PonteiroParaInicio Primeiro, Atual, Anterior;
Anterior = (Caixa*)malloc(sizeof(Caixa));
Atual = (Caixa*)malloc(sizeof(Caixa));
Primeiro = *l;
//Lista vazia? Sai do programa
if (Primeiro == NULL) return 0;
// Se for o primeiro, apontamos a lista para o segundo e removemos o primeiro
if (Primeiro->dado == valor) {
*l = Primeiro->proximaCaixaPonteiro;
free(Primeiro);
return 1;
}
for (Atual = *l; Atual != NULL && Atual->dado != valor; Atual = Atual->proximaCaixaPonteiro) {
Anterior = Atual;
}
// O atual é NULL, ou seja, chegamos ao fim da lista e não achamos, então saimos do programa
if (Atual == NULL) return 0;
// Decomente para ver os itens sendo achados
// printf("Atual achado: %d\n", Atual->dado);
// printf("Anterior achado: %d\n", Anterior->dado);
// O anterior vai apontar para o que o Atual (achado) aponta
// Se o atual aponta pra NULL, quer dizer que o anterior agora é o ultimo
Anterior->proximaCaixaPonteiro = Atual->proximaCaixaPonteiro;
free(Atual);
return 1;
}
// Coloca um item no inicio da lista
int inserindoCaixa(PonteiroParaInicio *l, int valor) {
//Precisamos criar uma nova caixa que vai no inicio.
PonteiroParaInicio novo = (Caixa*)malloc(sizeof(Caixa));
// Dizemos que o proximo que apontamos é o que estava guardado na lista
// o valor do novo é passado pela função
// e finalmente dizemos que a lista aponta agora para o novo
novo->proximaCaixaPonteiro = *l;
novo->dado = valor;
*l = novo;
return 1;
}
// Procurando um item na lista, se ele existir o for para e retorna 1
int procuraItem(PonteiroParaInicio l, int procurado) {
PonteiroParaInicio Atual = (Caixa*)malloc(sizeof(Caixa));
for(Atual = l; Atual != NULL; Atual = Atual->proximaCaixaPonteiro) {
if (Atual->dado == procurado) {
// printf("Existe!\n");
return 1;
}
}
return 0;
}
// Não precisamos passar *l porque não queremos alterar nada dentro da lista
void mostrarLista(PonteiroParaInicio l) {
// Precisamos de um ponteiro do tipo Caixa alocando
// uma caixa para podermos guardar sempre o proximo
PonteiroParaInicio Atual = (Caixa*)malloc(sizeof(Caixa));
int i = 0;
for (Atual = l; Atual != NULL; Atual = Atual->proximaCaixaPonteiro, i++) {
printf("%d - %d\n", i, Atual->dado);
}
}
// Diz que a lista é nula (inicializa)
void inicializaLista(PonteiroParaInicio *l) {
if (*l != NULL ) {
printf("Lista ja inicializada.\n");
exit(1);
} else {
printf("Inicializando lista.\n");
*l = NULL;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment