// OPERACIONES VARIAS CON LISTAS TIPO LISP #include <stdio.h> #include <stdlib.h> struct numero { int num; struct numero *sig; }; struct valores { struct numero *l1; struct numero *l2; }; struct numero *vals; void imprime(struct numero *l) { printf("\nLista ordenada\n"); while(l) { printf("%d ", l->num); l = l->sig; } } struct numero *crea_espacio(void) { struct numero *nodo; if (!(nodo = (struct numero *) malloc(sizeof(struct numero)))) { puts("no hay memoria...\n"); return NULL; } nodo->sig = NULL; nodo->num = 0; return nodo; } struct numero *pide_numeros(void) { int valor = 1; struct numero *nodo = NULL; struct numero *ant = NULL; struct numero *sig = NULL; struct numero *ini = NULL; puts("\ntermine con un 0\n"); while(valor != 0) { scanf("%d", &valor); if (!valor) break; nodo = crea_espacio(); nodo->num = valor; if (!ini) { ini = nodo; ant = nodo; } else { ant->sig = nodo; ant = nodo;} } return ini; } void append(struct numero *l, struct numero *nuevo) { struct numero *temp = NULL; while(l) { temp = l; l = l->sig; } if(!temp) return; while(nuevo) { temp->sig = crea_espacio(); temp->sig->num = nuevo->num; temp = temp->sig; nuevo = nuevo->sig; } } void divide(struct numero *l) { int flag = 1; vals->l1 = crea_espacio(); vals->l2 = crea_espacio(); while(l) { if (flag) { if (!vals->l1->num) vals->l1 = l; else {append(vals->l1, l); flag = 0;} } else { if (!vals->l2->num) vals->l2->num = l->num; else {append(vals->l2, l); flag++;} } l = l->sig; } imprime(vals->l1); imprime(vals->l2); } struct numero *mezcla(struct numero *l01, struct numero *l02) { struct numero *ant = NULL; struct numero *ini = NULL; struct numero *tem = NULL; printf("\n<<mezcla>>\n"); while(l01 && l02) { tem = crea_espacio(); if(l01->num < l02->num) { tem->num = l01->num; l01 = l01->sig;} else { tem->num = l02->num; l02 = l02->sig;} if(!ini) {ini = tem; ant = tem;} else {ant->sig = tem; ant = tem;} } if(l01) append(tem, l01); if(l02) append(tem, l02); return ini; } struct numero *ordena(struct numero *l) { struct numero *l01=NULL; struct numero *l02=NULL; if(l && !l->sig) return l; printf("\ndato= %d",l->num); divide(l); l01 = ordena(vals->l1); l02 = ordena(vals->l2); return mezcla(l01, l02); } void main (void) { struct numero *a; vals = (struct valores *) malloc(sizeof(struct valores)); a = pide_numeros(); a = ordena(a); imprime(a); }