Lista dinámica

19/11/2003 - 17:06 por Sergio | Informe spam
Alguien sabe decirme porque esta mal esta función de borrado?

void BorrarLista()
{ item actual;
if (comienzo == NULL)
return;
while (comienzo != NULL) {
actual = comienzo;
comienzo = actual->sig;
delete actual;
}
}

Es una sencilla función para borrar una lista dinámica, pero no se porque el
Visual c++ tiene que eliminar datos de memoria cuando cierro el programa que
estoy probando. Al parecer algún elemento de la
lista no se borra del todo de memoria.

Por si el problema viniera de como cargo la lista:

void Agregar(dato n) {
item actual;
item anterior;
item nuevo = new elem;
nuevo->d = n;
if (comienzo == NULL) {
comienzo = nuevo;
nuevo->sig = NULL;
return;
}
for (actual = comienzo;actual->sig != NULL;actual = actual->sig) {
if (actual->d.tiempo > n.tiempo) break;
anterior = actual;
}
if (actual->d.tiempo > n.tiempo) {
if (actual == comienzo) {
nuevo->sig = actual;
comienzo = nuevo;
return;
}
nuevo->sig = anterior->sig;
anterior->sig = nuevo;
return;
}
nuevo->sig = NULL;
actual->sig = nuevo;
}

Todo sea que no venga de aqúí el problema, ya no entendería nada.

Preguntas similare

Leer las respuestas

#11 Sergio
21/11/2003 - 18:38 | Informe spam
Hay de mi, ya he encontrado el fallo, esta en la clase.
Tengo una función que busca si existe o no el id por toda la lista, tal que
así;

item CEventos::Buscar(int id) {
item buscado = new elem;
item actual;
if(comienzo == NULL) {
buscado->d.id = -1;
return buscado;
}
actual = comienzo;
while(actual->sig != NULL) {
if (actual->d.id == id) break;
actual = actual->sig;
}
if (actual->d.id == id) {
buscado = actual;
return buscado;
}
buscado->d.id = -1;
return buscado;
}

esta definida así para poder hacer cosas como:

dato d;
d.tiempo = 0.2;
variable.Buscar(id)->d = d;

asi no me tengo que crear una función para modificar. Corregidme si me
equivoco, pero el problema creo que viene que por cada new que hago no hago
un delete, es decir que por cada vez que paso por esta función creo un
elemento nuevo en memoria, que luego no descargo, ¿me equivoco?
¿Alguna solución?
Respuesta Responder a este mensaje
#12 KAKATUO
21/11/2003 - 19:03 | Informe spam
Si, ese es el problema.
prueba con el código:

item CEventos::Buscar(int id) {
item buscado = NULL;
item actual;
if(comienzo == NULL) {
return NULL;
}
actual = comienzo;
while(actual->sig != NULL) {
if (actual->d.id == id) break;
actual = actual->sig;
}
if (actual->d.id == id) {
buscado = actual;
return buscado;
}
return NULL;
}

Y ahora:
...
dato d;
d.tiempo = 0.2;
dato encontrado = variable.Buscar(id);
if (encontrado) {
encontrado->d = d;
...
}
else {
...
}

Saludos.

"Sergio" escribió en el mensaje
news:
Hay de mi, ya he encontrado el fallo, esta en la clase.
Tengo una función que busca si existe o no el id por toda la lista, tal


que
así;

item CEventos::Buscar(int id) {
item buscado = new elem;
item actual;
if(comienzo == NULL) {
buscado->d.id = -1;
return buscado;
}
actual = comienzo;
while(actual->sig != NULL) {
if (actual->d.id == id) break;
actual = actual->sig;
}
if (actual->d.id == id) {
buscado = actual;
return buscado;
}
buscado->d.id = -1;
return buscado;
}

esta definida así para poder hacer cosas como:

dato d;
d.tiempo = 0.2;
variable.Buscar(id)->d = d;

asi no me tengo que crear una función para modificar. Corregidme si me
equivoco, pero el problema creo que viene que por cada new que hago no


hago
un delete, es decir que por cada vez que paso por esta función creo un
elemento nuevo en memoria, que luego no descargo, ¿me equivoco?
¿Alguna solución?


Respuesta Responder a este mensaje
#13 KAKATUO
21/11/2003 - 19:06 | Informe spam
Perdona, es:

item encontrado = variable.Buscar(id);

y no:

dato encontrado = variable.Buscar(id);

Saludos.

"KAKATUO" escribió en el mensaje
news:bplk0p$lh7$04$
Si, ese es el problema.
prueba con el código:

item CEventos::Buscar(int id) {
item buscado = NULL;
item actual;
if(comienzo == NULL) {
return NULL;
}
actual = comienzo;
while(actual->sig != NULL) {
if (actual->d.id == id) break;
actual = actual->sig;
}
if (actual->d.id == id) {
buscado = actual;
return buscado;
}
return NULL;
}

Y ahora:
...
dato d;
d.tiempo = 0.2;
dato encontrado = variable.Buscar(id);
if (encontrado) {
encontrado->d = d;
...
}
else {
...
}

Saludos.

"Sergio" escribió en el mensaje
news:
> Hay de mi, ya he encontrado el fallo, esta en la clase.
> Tengo una función que busca si existe o no el id por toda la lista, tal
que
> así;
>
> item CEventos::Buscar(int id) {
> item buscado = new elem;
> item actual;
> if(comienzo == NULL) {
> buscado->d.id = -1;
> return buscado;
> }
> actual = comienzo;
> while(actual->sig != NULL) {
> if (actual->d.id == id) break;
> actual = actual->sig;
> }
> if (actual->d.id == id) {
> buscado = actual;
> return buscado;
> }
> buscado->d.id = -1;
> return buscado;
> }
>
> esta definida así para poder hacer cosas como:
>
> dato d;
> d.tiempo = 0.2;
> variable.Buscar(id)->d = d;
>
> asi no me tengo que crear una función para modificar. Corregidme si me
> equivoco, pero el problema creo que viene que por cada new que hago no
hago
> un delete, es decir que por cada vez que paso por esta función creo un
> elemento nuevo en memoria, que luego no descargo, ¿me equivoco?
> ¿Alguna solución?
>
>


Respuesta Responder a este mensaje
#14 Sergio
25/11/2003 - 17:28 | Informe spam
Pues si, ahora funciona correctamente
La verdad es que no me habia dado cuenta de que esa función estaba en medio
de todo el ajo. Se ejecuta despúes de cargar la lista, para saber si tiene
que mostrar algún dato, pero no le habia dado importancia.
Gracias por la ayuda
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida