//a) Dé una implementación completa (tipo y operaciones) para el TAD Lista no ordenada que garantice //que el tiempo de ejecución de las operaciones sea O(1) typedef struct nodo { int elem; nodo * sig; } typedef nodo *LEnt; /* Crea la lista vacía. */ LEnt crearL (){ return NULL; } /* Inserta el entero x al principio de la lista . */ void insertar ( int x , LEnt & l ) { LEnt nuevo = new nodo; nuevo->elem=x; nuevo->sig=l; l=nuevo; } /* Verifica si la lista está vacía. */ bool esVacia (LEnt l) { return l==NULL; } /* Devuelve el primer elemento de una lista . Pre : ! esVacia (l) */ int primero ( LEnt l ) { return l->elem; } /* Devuelve la lista l sin su primer elemento . Pre : ! esVacia (l) */ void resto ( LEnt & l ){ LEnt aborrar = l; l=l->sig; delete aborrar; } //b) ¿Qué cambios realizaría si insFinal fuera parte del TAD? //se agrega un cabezal struct nodo { int elem ; nodo * sig ; }; struct cabezal { nodo * ini , * fin ; }; typedef cabezal * LEnt ; /* Crea la lista vacía. */ LEnt null () { cabezal * nueva = new cabezal ; nueva->ini = NULL ; nueva->fin = NULL ; return nueva ; } /* Inserta el entero x al principio de la lista l. */ void insertar (int x , LEnt & l ) { nodo * nuevo = new nodo; nuevo->elem = x; nuevo->sig = l->ini; l->ini = nuevo ; if (l->fin == NULL ) l->fin = l->ini; } /* Inserta el elemento x al final de la lista l. */ void insFinal ( int x , LEnt & l ) { nodo * nuevo = new nodo ; nuevo->elem = x ; nuevo->sig = NULL ; if (l->fin != NULL ) l->fin->sig = nuevo ; else // l- >ini == NULL l->ini = nuevo ; l->fin = nuevo ; } /* Verifica si la lista l est á vac ía. */ bool esVacia ( LEnt l ) { return l - > ini == NULL ; } /* Devuelve el primer elemento de la lista l. Pre : ! esVacia (l) */ int primero ( LEnt l ) { return l - > ini - > elem ; } /* Devuelve la lista l sin su primer elemento . Pre : ! esVacia (l) */ void resto ( LEnt & l ) { l = l - > ini - > sig ; nodo * aBorrar = l - > ini ; l = l - > sig ; delete aBorrar ; } (c) TAD LEnt Ordenada (Especificación) En el TAD Lista Ordenada los elementos d