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

#6 Sergio
21/11/2003 - 09:18 | Informe spam
¿como que el typedef deberia ser al revés? si lo haces así estaría
intentando crear un tipo a partir de algo que no existe, ¿no?
Vamos a ver, si tenemos:

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

si hacemos
typedef item * elem;
estariamos intentando hacer un nuevo tipo llamado item, y
que es un puntero del tipo elem, pero, ¿que es elem?

pero si hacemos
typedef elem * item;
defines elem como *item, e item sabemos que es una estructura formada por
dato, y por un puntero a si misma.
Me imagino que al hacer las pruebas habrás copiado mal las definiciones,
porque si no no lo entiendo, a mi ni me compila haciendolo al revés.

En relación a lo que me comentabas sobre si hago o no borrar lista, si que
lo hago, de hecho tengo puesto un contador para saber cuantas veces entra en
el bucle y coincide con el número de elementos que habia en la lista, es
decir, si tenia 6 elementos, hace el delete 6 veces.
Pero lo que me preocupa es que con los 6 elementos me hace el object dump 12
veces. Y he comprobado que esto solo me pasa si meto algo en la lista.
Ya sabes, informática.
Respuesta Responder a este mensaje
#7 Sergio
21/11/2003 - 09:34 | Informe spam
Tenias razón, se me ha ido la olla, se me habia metido en la cabeza que el
typedef era al revés. El código que puse lo puse de cabeza, y lo puse al
revés, esta claro que on compila sino.
Respuesta Responder a este mensaje
#8 Sergio
21/11/2003 - 09:46 | Informe spam
Vale, ya lo tengo, el problema viene al hacer el new:

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

en item nuevo = new elem; la inicialización correcta es:
item nuevo = (item) new elem;
haciendolo así no hay problema, creo.

Pues gracias por todo.
Respuesta Responder a este mensaje
#9 KAKATUO
21/11/2003 - 17:04 | Informe spam
Sergio,
Creo que no puede ser debido a eso.
A continuación te mando un copy-paste de mi ejemplo de prueba.
crea un proyecto nuevo de consola usando MFC y le das el nombre "lista"
sustituye el contenido de lista.cpp por mi código y me cuentas.

____________________COMIENZA COPY-PASTE__________________
// lista.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "lista.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

////////////////////////////////////////////////////////////////////////////
/
// The one and only application object

CWinApp theApp;

using namespace std;

typedef struct DATO
{
int id;
char suceso[10];
double tiempo;
} dato;

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


item comienzo = NULL;

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

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;
}

void Funcion()
{

dato c;
c.id = 3;
strcpy(c.suceso, "suceso c");
c.tiempo = 0.99;

Agregar(c);

dato b;
b.id = 2;
strcpy(b.suceso, "suceso b");
b.tiempo = 1.02;

Agregar(b);

dato a;
a.id = 1;
strcpy(a.suceso, "suceso a");
a.tiempo = 1.00;

Agregar(a);


BorrarLista();

}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.

Funcion();
}

return nRetCode;
}

_______________________ FIN COPY-PASTE____________________

Saludos.

"Sergio" escribió en el mensaje
news:%
Vale, ya lo tengo, el problema viene al hacer el new:

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

en item nuevo = new elem; la inicialización correcta es:
item nuevo = (item) new elem;
haciendolo así no hay problema, creo.

Pues gracias por todo.


Respuesta Responder a este mensaje
#10 Sergio
21/11/2003 - 18:09 | Informe spam
Tienes razón, no me habia dado cuenta pero habia cambiado el modo de debug
a release para hacer un par de pruebas, y luego no lo he cambiado, es por
eso por lo que no aparecía el error.
He probado tu código, en modo debug, y no hace lo que me pasa a mi, curioso,
sobre todo para ser el mismo código el que gestiona la lista.
He cogido la clase a la que pertenecen las funciones, y me la he llevado a
un proyecto de consola como el tuyo, y ha funcionado correctamente. Hace
poco que uso el vc++, por lo que me pregunto si
el tipo de proyecto podría tener algo que ver en todo esto, lo dudo mucho, y
no tendría sentido, pero con esto de la informatica todo puede ser.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida