En primer caso *persona, tu le estas pasando un puntero o la dirección de una instacia de estructura(struct). Que es la forma mas tipica(*p) a la hora de pasar valores por referencia en las funciones.
En el segundo caso **persona, tu le estas pasando un puntero que guarda la direccion de otro puntero(p1). Este p1 guarda la direccion de una instancia de estructura. He leído por ahí que algunos programadores llaman a evitar estos casos(**p) e intentar implementarlos de otra forma.
De acuerdo a la defincion de tu RemoveContacto, sólo el primer caso hará lo que se desea que haga(el otro debería dar error). Para utilizar el segundo caso habria que hacer las modificaciones siguientes a la clase RemoveContacto:
Código:
struct contacto *removeContacto(struct contacto **persona,int posición){
struct contacto *anterior=NULL;
while(posicion>1){
anterior=*persona;
*persona=(*persona)->siguiente;
posicion--;
}
if(anterior==NULL){
anterior= (*persona)->siguiente;
free(*persona);
return anterior;
}else{
anterior->siguiente=(*persona)->siguiente;
free(*persona);
return NULL;
}
}
Espero que de algo te pueda ayudar esto.
Quizas tambien quieras leer acá:
http://es.geocities.com/jorge_hefty/temas2.htm