les dejo mi biblioteca personal de listas enlazadas simples xD
#ifndef LISTA_H_INCLUDED
#define LISTA_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
/* Definicion de la lista. */
struct nodo{
int n;
struct nodo *sgte;
};
/* Prototipos */
struct nodo* crear(struct nodo* l)
void printLista(struct nodo *inicio);
int length(struct nodo *inicio);
struct nodo* insertarOrdenAscendente(struct nodo *inicio, int val);
struct nodo* insertarInicio(struct nodo *inicio, int val);
struct nodo* insertarFinal(struct nodo *inicio, int val);
struct nodo *buscarValor(struct nodo *inicio, int val);
struct nodo *delete(struct nodo *inicio, int val);
/* Crea una lista vacia */
struct nodo* crear(struct nodo* l){
return l = NULL;
}
/* Imprime una lista desde el primer elemento */
void printLista(struct nodo *inicio){
struct nodo *p;
printf("Lista: ");
p = inicio;
while (p!=NULL){
printf("%d ", p->n);
p = p->sgte;
}
printf("\n");
}
int length(struct nodo *inicio){
struct nodo *p;
int len;
len = 0;
p = inicio;
while (p!=NULL){
len++;
p = p->sgte;
}
return len;
}
/* inserta un nuevo nodo manteniendo la lista ordenada de forma ascendente */
struct nodo* insertarOrdenAscendente(struct nodo *inicio, int val){
struct nodo *p, *new;
new = (struct nodo*)malloc(sizeof(struct nodo));
new->n = val;
/* Lista vacia */
if (inicio==NULL){
inicio = new;
inicio->sgte = NULL;
}
/* Lista con elementos */
else{
/* Caso especial (se debe insertar como primer elemento) */
if (val < inicio->n){
new->sgte = inicio;
inicio = new;
}
/* Caso general */
else{
p = inicio;
while (p->sgte!=NULL && (p->sgte)->n < val)
p = p->sgte;
new->sgte = p->sgte;
p->sgte = new;
}
}
return inicio;
}
/* inserta un nuevo nodo al inicio de la lista, desplazando el resto de los nodos */
struct nodo* insertarInicio(struct nodo *inicio, int val){
struct nodo *new;
new = (struct nodo*)malloc(sizeof(struct nodo));
new->n = val;
new->sgte = inicio;
return new;
}
/* inserta un nuevo nodo al final de la lista */
struct nodo* insertarFinal(struct nodo *inicio, int val){
struct nodo *p, *new;
new = (struct nodo*)malloc(sizeof(struct nodo));
new->n = val;
new->sgte = NULL;
/* Lista vacia */
if(inicio == NULL){
inicio = new;
}
else{
p = inicio;
while (p->sgte != NULL)
p = p->sgte;
p->sgte = new;
}
return inicio;
}
/* busca un valor en una lista, retorna el puntero al primer nodo que contenga dicho valor */
struct nodo *buscarValor(struct nodo *inicio, int val){
struct nodo *p;
p = inicio;
while (p!=NULL && p->n!=val)
p = p->sgte;
return p;
}
/* borra un nodo de la lista liberando la memoria usada por este */
struct nodo *delete(struct nodo *inicio, int val){
struct nodo *p, *aux;
if(inicio != NULL){
/* Caso especial (se debe borrar el primer nodo) */
if (inicio->n == val){
aux = inicio;
inicio = aux->sgte;
free(aux);
}
else{
/* Se busca el nodo a borrar */
p = inicio;
while (p->sgte!=NULL && (p->sgte)->n!=val)
p = p->sgte;
/* se borra en nodo */
if (p->sgte != NULL){
aux = p->sgte;
p->sgte = aux->sgte;
free(aux);
}
}
}
return inicio;
}
#endif // LISTA_H_INCLUDED