/*************************************************************
* DEMO_LL.C
*
* Este programa ilustra el comportamiento de una lista ligada
* de enteros.
*************************************************************/
#include <alloc.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <mem.h>
#include "lista.h"
void despliegaPantallaInicial(void);
void borraLista(void);
void despliegaNodo(NODO *pNodo);
int igual(void *pInfo, void *pLlave);
int mayor(void *pInfo, void *pLlave);
LISTA lista = NULL;
int main(void)
{
NODO *pNodo, *pPos, *pAnt;
int dato;
char operador,sdato[6];
clrscr();
inicializarLista(&lista);
despliegaPantallaInicial();
operador=5;
while(operador!='8')
{
gotoxy(28,10); printf(" ");
gotoxy(51,10); printf(" ");
gotoxy(28,10);
//if((operador = getch()) == ESC) break;
//if(operador!=ESC)
//{
gotoxy(26,10);
operador = getchar();
switch(operador)
{
case '1':
printf("Insertar");
gotoxy(36,10);
//getchar(sdato);
scanf("%d",&dato);
pNodo = creaNodo(&dato, sizeof(int));
if(listaVacia(lista)) pAnt = NULL;
else pPos = buscaLista(lista, &pAnt, &dato, mayor);
insertarLista(&lista, pAnt, pNodo);
break;
case '2':
printf("Extraer. ");
if(listaVacia(lista))
{
printf("Lista Vacia. Presiona una tecla para continuar");
getch();
}
else
{
gotoxy(36,10);
scanf("%d",&dato);
//gets(sdato);
//dato = atoi(sdato);
if(!(pPos = buscaLista(lista, &pAnt, &dato, igual)))
{
printf("Valor inexistente. Presiona una tecla para continuar");
getch();
}
else
{
clrscr();
despliegaPantallaInicial();
extraerLista(&lista, pAnt, &dato, sizeof(int));
}
break;
}
}
clrscr();
despliegaPantallaInicial();
visitarLista(lista, despliegaNodo);
putchar('\n');
}
inicializarLista(&lista);
//visitarLista(lista, despliegaNodo);
putchar('\n');
return 0;
}
/*************************************************************
* void despliegaPantallaInicial(void)
*
* Esta función despliega la explicación de lo que hace el
* programa y las instrucciones de su uso.
*************************************************************/
void despliegaPantallaInicial(void)
{
clrscr();
gotoxy(5,3);
printf("Este programa demuestra el comportamiento de una");
printf(" lista ligada. En esta");
gotoxy(5,4);
printf("lista se almacenan enteros los cuales son");
printf(" acomodados en orden ascendente.");
gotoxy(5,5);
printf("Hay dos operaciones: Para insertar un numero a ");
printf("la lista presiona la tecla");
gotoxy(5,6);
printf("[1], luego el numero a insertar. Para ");
printf("extraer un numero de la lista");
gotoxy(5,7);
printf("presiona la tecla [2], luego el numero a extraer.");
printf(" Para terminar presiona");
gotoxy(5,8);
printf("la tecla [8].");
gotoxy(15,10);
printf("Operacion [ ] Valor [ ]");
}
/*************************************************************
* void despliegaNodo(NODO *pNodo)
*
* Esta función despliega para un nodo, su campo de información
* y su campo siguiente.
*************************************************************/
void despliegaNodo(NODO *pNodo)
{
static x = 10, y = 13;
/* Si es el primer nodo de la lista */
if(pNodo == lista)
{
x = 10; y = 13;
}
/* Si se va a saltar de renglón */
if(x == 74)
{
x = 10; y += 3;
}
/* Despliega el contenido del nodo en un recuadro */
gotoxy(x,y); putch(0x10);
gotoxy(x+1,y-1); printf("+-------------+");
gotoxy(x+1,y); printf("%6d%6p", *(int *)(pNodo->pInfo),pNodo->pSig);
gotoxy(x+1,y+1); printf("+-------------+");
x += 16;
/* Si va a desplegar otra pantalla */
if(pNodo->pSig && y == 22 && x == 74)
{
printf("ENTER PARA CONTINUAR");
x = 10; y = 13;
borraLista();
}
}
/*************************************************************
* void borraLista(void)
*
* Borra de la pantalla la lista.
*************************************************************/
void borraLista(void)
{
int i;
for(i = 12; i < 25; i++)
{
gotoxy(1,i); clreol();
}
}
/*************************************************************
* int igual(void *pInfo, void *pLlave)
*
* Esta función regresa 0 si info y llave son iguales, diferente
* de cero en caso contrario.
*************************************************************/
int igual(void *pInfo, void *pLlave)
{
return *(int *)pInfo - *(int *)pLlave;
}
/*************************************************************
* int mayor(void *pInfo, void *pLlave)
*
* Esta función regresa 0 si info > llave, diferente de cero
* en caso contrario.
*************************************************************/
int mayor(void *pInfo, void *pLlave)
{
return *(int *)pInfo <= *(int *)pLlave;
}
/*************************************************************
* LISTA.C
*
* Este módulo implementa las operaciones de una lista ligada
* generalizada, est