TDA Vector con Memoria Dinámica

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define CAP 100
#define SIN_MEM 0
#define DUPLICADO 2
#define TODO_OK 1

typedef struct
{
int * vec;
int cap;
int ce;
} vector;

bool crearVector(vector *pl)
{
pl-> vec = (int*) malloc( 8*sizeof(int));
if(!pl->vec) //pl->vec == NULL
return false;
pl->ce=0;
pl->cap = 8;
return true;
}

int vectorInsertarEnOrden( vector *pl, int elem)
{
int ncap;
int *nvec;
if( pl->ce == pl->cap)
{
ncap = pl->cap*2;
nvec = (int*)realloc(pl->vec, ncap*sizeof(int));
if(!nvec)
return SIN_MEM;
pl->vec= nvec;
pl->cap = ncap;
}
int *i = pl->vec;
int *ult= pl->vec+(pl->ce-1);
while(i <= ult && elem > *i)
i++;
// chequear si hay duplicados
if(i <= ult && elem == *i)
return DUPLICADO;
for( int *j=ult; j>=i; j--)
*(j+1) = *j;

*i = elem;
pl->ce++;
return TODO_OK;

}


bool vectorEliminarOrd(vector*pl, int elem)
{
if(pl->ce*3 <= pl->cap) // si un tercio del vector esta cargado
{
pl->cap/=2;
pl->vec = (int*)realloc(pl->vec,pl->cap*sizeof(int)); // esta reduciendo, no necesito guardar en variables temporales porque no va a tirar error xq va a achicar la capacidad.
}
int *i = pl->vec;
int *ult = pl->vec+(pl->ce-1);
while(i<=ult && elem >*i)
i++;
if(i>ult || elem < *i)
return false;
for( int *j=i+1; j<=ult; j++)
*(j-1)=*j;
pl->ce--;
return true;
}

void mostrarVector(vector *pl)
{
int cant = pl->ce;
while(cant!=0)
{
printf("%d\n", *(pl->vec));
pl->vec++;
cant--;
}
}


void destruirVector(vector *pl)
{
free(pl->vec);
}


int main ()
{
vector l;
crearVector(&l); // como no estamos en poo es obligatorio crearlo
vectorInsertarEnOrden(&l, 2); // no va a insertar al final y luego ordenar. Va insertando en orden. Debo tener la lista ordenada.
vectorInsertarEnOrden(&l, 1); // no va a insertar al final y luego ordenar. Va insertando en orden. Debo tener la lista ordenada.
vectorInsertarEnOrden(&l, 6);
vectorInsertarEnOrden(&l, 9);
vectorInsertarEnOrden(&l, 5);
mostrarVector(&l);
return 1;

}