Ver Mensaje Individual
  #8 (permalink)  
Antiguo 21/04/2013, 10:59
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 5 meses
Puntos: 83
Respuesta: Error con clase de listas enlazadas.

Y tampoco funciona, tienes que curratelo un poco mas; sigue el codigo paso a paso, pon algun printf para mostrar los datos que estas manipulando y veras que el Inserta nunca entra en el condicional 'if (n==pos)':

Código:
Lista lista(2);
lista.Insertar(123, 0);

for (int i=0; i<n; i++) {
    if (n==pos)

pos es 0
n vale 2
entre i = 0, i < 2 nunca se cumple que n==pos, en numeros nunca se cumple que [0,1]==2
Una vez tengas solucionado esto veras que te provoca una violacion de acceso por escribir sobre un puntero no inicializado:

Código:
l nuevo;
nuevo->valor=val;//violacion de acceso
Estas trabajando sobre el modelo de memory pools pero dentro de las funciones estas usando cosas de bloqueo e insercion dinamico. No mezcles las cosas, cada modelo funciona de una forma. Si quieres trabajar con el memory pool no puedes insertar datos porque la lista ya está declarada, solo puedes asignar datos

Código:
void Lista :: Insertar(TipoBase val, int pos) {//deberias renombrarla como Asignar
    int n = NNodos();
    Nodo *ptr;

    ptr = p;
    for (int i=0; i<n; i++){
        if (i == pos) {//ojo, aqui es donde tenias n==pos
	    ptr->valor = val;
	    break;//aqui sales del for para acelerar el proceso
        }
	ptr = ptr->siguiente;
    }
}
Esto es un memory pool y se basa en una reserva de memoria previa, por eso no puedes insertar datos sino que puedes asignar datos (claro que puedes llamarlo como quieras, pero se recomienda que el nombre de las funciones sea descriptivo acorde con lo que hacen).

El puntero ptr se usa para moverte por dentro de la lista, y siempre tienes que usar comprovaciones de error para asegurarte que ptr->siguiente no sea nulo (provocarias un b.o.f.) aun cuando el contador te indique lo contrario. Esto te sirve para corregir todas las demas funciones porque tambien te provocan violacion de acceso.

Saludos
vosk