Hola Tomas,
No hay una forma más correcta que la otra, pero si hubiera que tomar una convención a la hora de especificar TADs sobre qué operaciones definir como procedimientos y qué operaciones definir como funciones, podría ser la siguiente:
Si la operación modifica la
estructura (constructoras/destructoras) se recomienda definirla como un
procedimiento que reciba la estructura por referencia.
Si la operación no modifica la estructura (selectoras/predicados) se recomienda definirla como una función que retorna algo del tipo correspondiente.
Aunque esto no sea lo que se hace en las tareas del laboratorio.
En cuanto a las diferentes pre-condiciones, es común verse frente a esa decisión de exigir algo como precondición o
permitir que no se cumpla y especificar qué sucedería si no se cumple. Esto dependerá del propósito que tengamos en mente al definir la especificación del TAD, por lo que a priori tampoco habría una más correcta que otra.
Un error podría ser no exigir que la cola no esté vacía como pre-condición, y tampoco especificar qué ocurre cuando se invoca a esa operación con una cola vacía, porque esto podría dar como resultado una especificación ambigua.
Espero haber aclarado tu duda, cualquier cosa volvé a consultar.
¡Saludos!