#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define FALSE 0
#define TRUE !FALSE
typedef char boolean;
typedef int (*list_funCmp_t)(void *a, void *b);
typedef void (*list_funPrint_t)(void *a);
//#define INT 0
#define STRING 0
//#define CHAR 0
typedef struct lPtr{
void *valor;
struct lPtr *next;
}list_t;
typedef struct{
list_t *entrada; //Entrada a la lista;
int sizeTipo;
list_funCmp_t funCmp;
list_funPrint_t funPrint;
}listAdm_t;
///Funciones de COMPARACION---------------------------------------///
int comparaEnteros(void *a, void *b){
return *(int *)a - *(int *)b;
}
int comparaCadenas(void *a, void *b){
return ((int)strcpy((char *)a
, (char*)b
)); //0 si son iguales, > 1 si b < a; < 1 si a < b }
///Funciones de IMPRESION----------------------------------------///
void imprimeEnteros(void *a){
}
void imprimeCadenas(void *a){
}
///Servicios de LISTA
listAdm_t *lAdmCreate(int sizeTipo, list_funCmp_t funCmp, list_funPrint_t funPrint){ //Crea La estructura administrativa
listAdm_t
*listAdm
= (listAdm_t
*)malloc(sizeof(listAdm_t
));
listAdm->funCmp = funCmp;
listAdm->funPrint = funPrint;
listAdm->sizeTipo = sizeTipo;
listAdm->entrada = NULL;
return listAdm;
}
list_t *creaNodo(listAdm_t *lista, list_t *pNext, void *elemento){ //necesito la estructura administrativa para el peso de dato
list_t
*nodo
= (list_t
*)malloc(sizeof(list_t
));
nodo->next = pNext;
memcpy((char *)nodo
->valor
, (char *)elemento
, lista
->sizeTipo
);
return nodo;
}
list_t *lInsertOrdered(listAdm_t *listAdm, list_t *lista, void *elemento){ //Ordenado de menor a mayor
if( !lista || (listAdm->funCmp(lista->valor,elemento)) >= 0 ){
return creaNodo(listAdm, lista, elemento);
}
lista->next = lInsertOrdered(listAdm, lista->next, elemento);
return lista;
}
void printList(listAdm_t *listAdm, list_t *list){
if(list){ //Si existe la lista
listAdm->funPrint(list->valor);
printList(listAdm, list->next);
}
}
int main(void){
#ifdef STRING
char i[] = "AAZ", b[] = "AAA";
listAdm_t *lista = lAdmCreate(sizeof(i), comparaCadenas,imprimeCadenas);
#endif
#ifdef CHAR
char i = 'a', b = 'g';
listAdm_t *lista = lAdmCreate(sizeof(char), comparaCaracteres,imprimeCaracteres);
#endif
#ifdef INT
int i= 6, b = 9;
listAdm_t *lista = lAdmCreate(sizeof(int), comparaEnteros,imprimeEnteros);
#endif
lista->entrada = lInsertOrdered(lista, lista->entrada, (void *)&i);
lista->entrada = lInsertOrdered(lista, lista->entrada, (void *)&b);
#ifdef INT
i = 0;
b = 8;
#endif
#ifdef STRING
#endif
lista->entrada = lInsertOrdered(lista, lista->entrada, (void *)&i);
lista->entrada = lInsertOrdered(lista, lista->entrada, (void *)&b);
printList(lista, lista->entrada);
return 0;
}