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

#1 Esteban
20/11/2003 - 11:09 | Informe spam
Hola,
en la función de borrado no veo nada raro el algoritmo sería así:

void BorrarLista( )
{
item actual;
item aux;
actual = comienzo;
//Mientras no se llegue al final de la lista se recorre y se borra
while (actual != NULL)
{
aux = actual->siguiente;
delete (actual);
actual = aux;
} //final while
}//final funcion BorrarLista( )

En cuanto a la función de agregar la he mirado un poco y no he encontrado
nada raro, de todas formas deberías ordenar un poco el código
poner comentarios y aclarar los terminos, te aseguro que ayuda mucho.
Asegurate entrando en modo debug que se recorre bien toda la lista en el
borrado
no vaya a ser que en el algún punto insertes mal en alguno de los casos al
hacer la ordenación y sea por eso.

"Sergio" escribió en el mensaje
news:
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.


Respuesta Responder a este mensaje
#2 Sergio
20/11/2003 - 12:37 | Informe spam
La función que me has pasado tiene un pequeño fallo, que igual se te ha
pasado por alto, y es que después del bucle comienzo no apunta a nada en
concreto, y si quieres añadir algun dato en la lista el programa salta, por
lo que poner comienzo = NULL; después del bucle es una buena opción.
He puesto el código que me has pasado y me vuelve a pasar lo mismo, el
studio tiene que limpiar de memoria lo que se me quede por ahi. He
comprobado cuantas entra en el bucle, y coincide con el número de elementos
que tengo en la lista, lo cual me hace pensar que mi problema puede no estar
en la lista, aunque hay una cosa que me mosquea: El número de elementos que
limpia de memoria
no coincide con el número de elementos de la lista. Pero si no cargo ningún
elemento en la lista no aparece nada de nada.
El mensaje que aparece es este:
{573} normal block at 0x01E225E8, 104 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Así unas cuantas veces.
Respuesta Responder a este mensaje
#3 Swin
20/11/2003 - 15:58 | Informe spam
A mi me da que el problema no lo tienes en la lista... De todas formas
puedes poner cómo declaras item y elem??


Saludos.


"Sergio" escribió en el mensaje
news:
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.


Respuesta Responder a este mensaje
#4 Sergio
20/11/2003 - 16:24 | Informe spam
typedef struct DATO {
int id;
char suceso[10];
double tiempo;
}dato;

typedef struct ITEM {
dato d;
struct ITEM *sig;
}item;

typedef elem * item;

Se me haría raro que el problema no estuviera en la lista puesto que la uso
en otro programa con la única diferencia en la definición de dato, que la
ajusto según mis necesidades, y en los dos me pasa lo mismo, es por eso por
lo que creo que mi problema esta en la lista, por eso y porque cuando no
cargo nada en la lista no me aparece ningún tipo de mensaje.
Respuesta Responder a este mensaje
#5 KAKATUO
20/11/2003 - 19:16 | Informe spam
Hola,
He probado tu código y, aparte de:
typedef elem * item;
que debería ser:
typedef item * elem;
Todo funciona correctamente.

Sólo reproduzco el efecto que mencionas cuando no llamo a la función
BorrarLista() al final.

He probado a incluir tres elementos en la lista, de todas las maneras
posibles y no reproduzco el error.

Pregunta: ¿Estas seguro de que se ejecuta la función BorrarLista()?

Saludos.



"Sergio" escribió en el mensaje
news:%
typedef struct DATO {
int id;
char suceso[10];
double tiempo;
}dato;

typedef struct ITEM {
dato d;
struct ITEM *sig;
}item;

typedef elem * item;

Se me haría raro que el problema no estuviera en la lista puesto que la


uso
en otro programa con la única diferencia en la definición de dato, que la
ajusto según mis necesidades, y en los dos me pasa lo mismo, es por eso


por
lo que creo que mi problema esta en la lista, por eso y porque cuando no
cargo nada en la lista no me aparece ningún tipo de mensaje.


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida