Skip to content

Instantly share code, notes, and snippets.

@emenjivar
Last active April 9, 2020 05:05
Show Gist options
  • Save emenjivar/c8710304871f18ca8a02f3a7c9b49c0e to your computer and use it in GitHub Desktop.
Save emenjivar/c8710304871f18ca8a02f3a7c9b49c0e to your computer and use it in GitHub Desktop.
implementacion de una lista enlazada en C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TRUE 1
#define FALSE 0
//definicion de estructuras
typedef struct nodo {
int valor;
struct nodo *siguiente;
struct nodo *anterior;
} Nodo;
typedef struct lista {
int total;
Nodo *primero;
Nodo *ultimo;
} Lista;
//prototipos de funciones
Lista *initialize();
int size(Lista *lista);
void *append(Lista *lista, int element);
void *add(Lista *lista, int index, int element);
int isEmpty(Lista *lista);
Nodo *get(Lista *lista, int index);
int contains(Lista *lista, int element);
void *removeElement(Lista *lista, int index);
//funcion principal
int main() {
unsigned long start = time(NULL);
Lista *lista = initialize();
if(isEmpty(lista))
printf("lista vacia\n");
else
printf("lista tiene valores\n");
append(lista, 10);
append(lista, 20);
append(lista, 30);
append(lista, 40);
append(lista, 50);
append(lista, 60);
append(lista, 70);
append(lista, 80);
append(lista, 90);
append(lista, 100);
add(lista, 0, 9); //agrego un 9 antes del 10
add(lista, 2, 19); //agrego un 19 antes del 20
if(isEmpty(lista))
printf("lista vacia\n");
else
printf("lista tiene valores\n");
if(contains(lista, 50))
printf("la lista contiene el 50\n");
else
printf("la lista no contiene el 50\n");
removeElement(lista, 6); //elimino el 50
if(contains(lista, 50))
printf("la lista contiene el 50\n");
else
printf("la lista no contiene el 50\n");
Nodo *nodo = lista->primero;
printf("\nrecorrer la lista en un while\n");
while(nodo != NULL) {
printf("valor: %d\n", nodo->valor);
nodo = nodo->siguiente;
}
printf("\nrecorrer la lista en un for\n");
for(int i=0; i<lista->total; i++)
printf("elemento [%d] = %d\n", i, get(lista, i)->valor);
printf("\n----valores de la lista----\n");
printf("primer elemento: %d\n", lista->primero->valor);
printf("ultimo elemento: %d\n", lista->ultimo->valor);
printf("total de elementos: %d\n", size(lista));
return 0;
}
//definicion de funciones
Lista *initialize() {
Lista *lista = malloc(sizeof(Lista));
lista->total = 0;
}
int size(Lista *lista) {
return lista != NULL ? lista->total : 0;
}
void *append(Lista *lista, int element) {
Nodo *tmp, *aux;
tmp = malloc(sizeof(Nodo));
tmp->valor = element;
tmp->siguiente = NULL;
if(lista->total == 0) {
lista->primero = tmp;
lista->ultimo = tmp;
lista->total = 1;
} else {
aux = malloc(sizeof(Nodo));
aux = lista->ultimo;
aux->siguiente = tmp;
lista->ultimo = tmp;
lista->total++;
}
}
void *add(Lista *lista, int index, int element) {
Nodo *tmp, *aux;
int cont = 0;
tmp = malloc(sizeof(Nodo));
tmp->valor = element;
tmp->siguiente = NULL;
//valido los indices
if((index < 0 || index > lista->total) && lista->total > 0) {
printf("indice invalido\n");
exit(1);
}
if(lista->total == 0) { //lista vacia
lista->primero = tmp;
lista->ultimo = tmp;
lista->total = 1;
} else if(index == 0) { //elemento al inicio de la lista
tmp->siguiente = lista->primero;
lista->primero = tmp;
lista->total++;
} else if(index == lista->total) { //elemento al final de la lista
lista->ultimo->siguiente = tmp;
lista->ultimo = tmp;
lista->total++;
} else { //elemento entre en inicio y el fin
aux = lista->primero;
while(aux->siguiente != NULL && cont < index - 1) {
aux = aux->siguiente;
cont++;
}
tmp->siguiente = aux->siguiente;
aux->siguiente = tmp;
lista->total++;
}
}
int isEmpty(Lista *lista) {
return lista != NULL ? (lista->total == 0 ? TRUE : FALSE) : TRUE;
}
Nodo *get(Lista *lista, int index) {
Nodo *nodo, *primero;
int cont = 0;
if((index < 0 || index > lista->total) && lista->total > 0) {
printf("indice invalido\n");
exit(1);
}
primero = lista->primero;
while(primero != NULL) {
if(cont == index) {
nodo = primero;
break;
}
primero = primero->siguiente;
cont++;
}
return primero;
}
int contains(Lista *lista, int element) {
Nodo *primero;
primero = lista->primero;
while(primero != NULL) {
if(primero->valor == element)
return TRUE;
primero = primero->siguiente;
}
return FALSE;
}
void *removeElement(Lista *lista, int index) {
Nodo *nodo, *tmp;
int cont = 0;
if((index < 0 || index > lista->total) && lista->total > 0) {
printf("indice invalido\n");
exit(1);
}
tmp = lista->primero;
if(index == 0 && lista->total == 1) { //eliminar el unico elemento de la lista
printf("elimino el unico elemento\n");
free(lista->primero);
lista->primero = NULL;
lista->ultimo = NULL;
lista->total = 0;
} else if (index == 0 && lista->total > 1) { //eliminar el primer elemento de la lista
tmp = lista->primero;
lista->primero = tmp->siguiente;
lista->total--;
free(tmp);
} else { //elimino cualquier elemento que no se ubique en los extremos
tmp = lista->primero;
while(tmp != NULL) {
if(cont + 1 == index) { //obtengo un elemento antes del indice buscado
nodo = tmp;
break;
}
tmp = tmp->siguiente;
cont++;
}
if(cont + 2 == lista->total) { //ultimo elemento de la lista
free(lista->ultimo);
lista->ultimo = nodo;
lista->total--;
nodo->siguiente = NULL;
} else {
tmp = nodo->siguiente;
nodo->siguiente = nodo->siguiente->siguiente;
free(tmp);
lista->total--;
}
}
}
@diegkaneki20
Copy link

Excelente aporte

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment