lunes, 26 de noviembre de 2007

CoLaOpErAcIoNyMaNtEnImIeNtO


#include {stdio.h}
#include {stdlib.h}

/* estructura autoreferenciada */
struct nodoCola {
char dato; /* define dato como un char */
struct nodoCola *ptrSiguiente; /* apuntador nodoCola */
}; /* fin de la estructura nodoCola */

typedef struct nodoCola NodoCola;
typedef NodoCola *ptrNodoCola;

/* prototipos de las funciones */
void imprimeCola( ptrNodoCola ptrActual );
int estaesta( ptrNodoCola ptrCabeza );
char retirar( ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon );
void agregar( ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon,
char valor );
void instrucciones( void );

/* la funcion main comienza la ejecucion del programa */
int main()
{
ptrNodoCola ptrCabeza = NULL; /* incializa ptrCabeza */
ptrNodoCola ptrTalon = NULL; /* incializa ptrTalon */
int eleccion; /* eleccion de menu del usuario */
char elemento; /* entrada char del usuario */

instrucciones(); /* despliega el menu */
printf( "Eleccion:= " );
scanf( "%d", &eleccion );

/* mientras el usuario no introduzca 3 */
while ( eleccion != 3 ) {

switch( eleccion ) {

/* agrega el valor */
case 1:
printf( "Introduzca un caracter: " );
scanf( "\n%c", &elemento );
agregar( &ptrCabeza, &ptrTalon, elemento );
imprimeCola( ptrCabeza );
break;

/* retira el valor */
case 2:

/* si la cola no esta¡ vacia */
if ( !estaesta( ptrCabeza ) ) {
elemento = retirar( &ptrCabeza, &ptrTalon );
printf( "Se desenfilo %c.\n", elemento );
} /* fin de if */

imprimeCola( ptrCabeza );
break;

default:
printf( "Eleccion no valida.\n" );
instrucciones();
break;

} /* fin de switch */

printf( "Eleccion:= " );
scanf( "%d", &eleccion );
} /* fin de while */

printf( "Fin de programa.\n" );

return 0; /* indica terminacion exitosa */

} /* fin de main */

/* despliega las instrcciones del programa para el usuario */
void instrucciones( void )
{
printf ( "Introuzca su eleccion:\n"
" 1 para retirar un elemento a la cola\n"
" 2 para eliminar un elemento de la cola\n"
" 3 para terminar\n" );
} /* fin de la funcion instrucciones */

/* inserta un nodo al final de la cola */
void agregar( ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon,
char valor )
{
ptrNodoCola ptrNuevo; /* apuntador a un nuevo nodo */

ptrNuevo = malloc( sizeof( NodoCola ) );

if ( ptrNuevo != NULL ) { /* es espacio disponible */
ptrNuevo->dato = valor;
ptrNuevo->ptrSiguiente = NULL;

/* si esta vacia inserta un nodo en la cabeza */
if ( estaesta( *ptrCabeza ) ) {
*ptrCabeza = ptrNuevo;
} /* fin de if */
else {
( *ptrTalon )->ptrSiguiente = ptrNuevo;
} /* fin de else */

*ptrTalon = ptrNuevo;
} /* fin de if */
else {
printf( "No se inserto %c. No hay memoria disponible.\n", valor );
} /* fin de else */

} /* fin de la funcion agregar */

/* elimina el nodo de la cabeza de la cola */
char retirar( ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon )
{
char valor; /* valor del nodo */
ptrNodoCola tempPtr; /* apuntador a un nodo temporal */

valor = ( *ptrCabeza )->dato;
tempPtr = *ptrCabeza;
*ptrCabeza = ( *ptrCabeza )->ptrSiguiente;

/* si la cola esta¡ vacia */
if ( *ptrCabeza == NULL ) {
*ptrTalon = NULL;
} /* fin de if */

free( tempPtr );

return valor;

} /* fin de la funcion retirar */

/* Devuelve 1 si la cola esta¡ esta, de lo contrario devuelve 0 */
int estaesta( ptrNodoCola ptrCabeza )
{
return ptrCabeza == NULL;

} /* fin de la funcion estaesta */

/* Imprime la cola */
void imprimeCola( ptrNodoCola ptrActual )
{

/* si la cola esta vacia */
if ( ptrActual == NULL ) {
printf( "La cola esta vacia.\n" );
} /* fin de if */
else {
printf( "La cola es:\n" );

/* mientras no sea el final de la cola */
while ( ptrActual != NULL ) {
printf( "%c --> ", ptrActual->dato );
ptrActual = ptrActual->ptrSiguiente;
} /* fin de while */

printf( "NULL\n" );
} /* fin de else */

} /* fin de la funcion imprimeCola */

No hay comentarios: