Operación y mantenimiento de una cola

#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 estaVacia( ptrNodoCola ptrCabeza );
char retirar( ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon );
void agregar( ptrNodoCola *ptrCabeza, ptrNodoCola *ptrTalon, 
              char valor );
void instrucciones( void );
 
/* la función main comienza la ejecución del programa */
int main()
{ 
   ptrNodoCola ptrCabeza = NULL; /* incializa ptrCabeza */
   ptrNodoCola ptrTalon = NULL;  /* incializa ptrTalon */
   int eleccion;                 /* elección de menú del usuario */
   char elemento;                /* entrada char del usuario */
 
   instrucciones(); /* despliega el menú */
   printf( "? " );
   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 está vacía */
            if ( !estaVacia( ptrCabeza ) ) { 
               elemento = retirar( &ptrCabeza, &ptrTalon );
               printf( "se desenfilo %c.n", elemento );
            } /* fin de if */
 
            imprimeCola( ptrCabeza );
            break;
 
         default:
            printf( "Eleccion no valida.nn" );
            instrucciones();
            break;
 
      } /* fin de switch */
 
      printf( "? " );
      scanf( "%d", &eleccion );
   } /* fin de while */
 
   printf( "Fin de programa.n" );
 
   return 0; /* indica terminación exitosa */
 
} /* fin de main */
 
/* despliega las instrcciones del programa para el usuario */
void instrucciones( void )
{ 
   printf ( "Introuzca su elección:n"
           "   1 para retirar un elemento a la colan"
           "   2 para eliminar un elemento de la colan"
           "   3 para terminarn" );
} /* fin de la función 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 vacía inserta un nodo en la cabeza */
      if ( estaVacia( *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 función 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 está vacía */
   if ( *ptrCabeza == NULL ) {
      *ptrTalon = NULL;
   } /* fin de if */
 
   free( tempPtr );
 
   return valor;
 
} /* fin de la función retirar */
 
/* Devuelve 1 si la cola está vacía, de lo contrario devuelve 0 */
int estaVacia( ptrNodoCola ptrCabeza )
{ 
   return ptrCabeza == NULL;
 
} /* fin de la función estaVacia */
 
/* Imprime la cola */
void imprimeCola( ptrNodoCola ptrActual )
{ 
 
   /* si la cola esta vacía */
   if ( ptrActual == NULL ) {
      printf( "La cola esta vacia.nn" );
   } /* 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( "NULLnn" );
   } /* fin de else */
 
} /* fin de la función imprimeCola */

¿Has encontrado algún error? ¿Tienes la solución? Dejame tu correción ;-)

Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.

Otro punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:

  • Si es lenguaje C [c]Código en C[/c]
  • Si es lenguaje Pascal [pascal]Aquí dentro el código de Pascal[/pascal].

De esta manera el código coloreas el código.

Otro punto importante para muchos que sienten que se les ignora: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el con lo siguiente:

Me reservo el derecho de alterar, publicar o no los comentarios as´ como cambiar mis condiciones en el momento que así lo requiera.

¿estas de acuerdo? entonces adelante que ya te he quitado bastante tiempo leyendo esta basura de advertencias :)