Aver si entiendo tu implementacion. En la variable "primero" llevas el puntero del primer nodo. Y de ahi se arma tu lista,
Entonce tu problema recide que en borrar nodo lo que haces es poner como primero el siguiente nodo al que borras. Y esto esta mal. Porque estas eliminado todos los nodos que estan atras del tuyo. Fijate si agregas 5 o 6 nodos. si borras el cuarto se van a borrar los tre primeros.
Lo que deberias hacer es llevar un puntero del nodo anteriro que que vas a borrar y enlazar ese nodo anterior con el siguiente al que vas a borrar. Esto se logra en el for que itera nodo a nodo agregadon una variable auxiliar que lleve memoria.
Código C++:
Ver originalant = null;
for (aux = inicio; aux!=NULL; ant=aux, aux=aux->siguiente)
if (strcmp(aux
->dni
,dniop
)==0) {
if (ant != null) // Me fijo que ant no sea nulo. Indica si estoy o no en el primer elemento.
ant->siguiente = aux -> siguiente;
else
inicio = aux->siguiente; // En este caso borro el primer elemento por lo que tengo que modificar el primero.
}