Ejercicios de Vectores con Aritmética de Punteros

Insertar Elemento por Posición: Supongamos que tenemos el vector vec, donde cantE es la cantidad total de elementos cargados, TAM es el tamaño máximo del vector, y luego vienen el dato que quiero insertar y la posición.

int cantE = sizeof(vec1)/sizeof(vec1[0]);
insertarElem(vec,&cantE,TAM,181,4);

Voy a recibir: vec como puntero, cantE como puntero porque voy a modificarlo, sino se haria una copia y elem y pos como solo voy a usarlos y no necesito modificarlos los paso por copia.

Como voy a insertar en una posición, en el caso de que la cantidad de Elementos que tenga es igual al TAM, voy a perder un elemento, se va a caer del vector.

Entonces, lo que voy a hacer es posicionar el puntero del vector al final, en el caso de que cantE sea igual a TAM lo posiciono uno menos y sino me quedo con la cantE.

Luego hago un for desde el final del vector ( *cantE ) hasta pos-1 decrementando y copiando en vec lo que hay en vec -1 y finalmente copio en vec el elemento que estoy insertando y aumento cantE.

int insertarElem(int *vec,int *cantE,int tam,int elem,int pos)
{
    int i;

    vec+=(*cantE==tam)?(*cantE)--:*cantE;   
    for(i=*cantE; i>pos-1; i--)
    {
        *(vec)=*(vec-1);
        vec--;
    }
    *cantE+=1;
    *vec=elem;
    return 1;
}




---- es equivalente

int insertarElem(int *vec,int *cantE,int tam,int elem,int pos)
{
    int i;


    if((*cantE)==tam)  // si es igual al tam max significa que voy a descartar uno
    {
        vec+=(*cantE)-1;  // posiciono el puntero del vector en la posicion final
        *cantE -= 1;  //decremento cantE porque luego voy a incrementarlo al insertarlo
    }
    else
    {
        vec+=*cantE;  // si no es igual significa que no se va a caer del vector no voy a descartar ninguno
    }
    for(i=*cantE; i>pos-1; i--)
    {
        *(vec)=*(vec-1);
        vec--;
    }
    *cantE+=1;
    *vec=elem;
    return 1;
}

Insertar Elementos de Forma Ordenada

int insertarElemOrd(int *vec,int *cantE,int tam,int elem)
{
    int *vecI=vec;

    if(*cantE==0)
    {
        *vecI=elem;
        *cantE+=1;
        return 1;
    }

    if(*cantE==tam && elem>=*(vec+*cantE-1))
        return 0;

    vec+=(*cantE==tam)?--(*cantE):*cantE;

    while(elem<*(vec-1) && vecI<vec)
    {
        *vec=*(vec-1);
        vec--;
    }

    *vec=elem;
    *cantE+=1;
    return 1;
}

Eliminar Ocurrencias:

printf("Se eliminar %d veces el %d\n",eliminarOcurrencias(vec1,&cantE,3),3);
int eliminarOcurrencias(int *vec,int *cantE,int elim)
{
int *pEsc=vec,*pLec=vec,resto=0;

while((pEsc-vec)<*cantE)
{
while(*pLec==elim)
{
pLec++;
resto++;
}
*pEsc=*pLec;
pEsc++;
pLec++;

}
*cantE-=resto;

return resto;
}


Ejercicios:

  • Eliminar un elemento de una posición.
  • Eliminar la primera aparición.
  • Eliminar todas las apariciones.
  • Insertar al principio.
  • Insertar al final.
  • Buscar ordenado.
  • Ordenar