listas enlazadas con c++

juancxo
30 de Diciembre del 2008
hola para un programa requiero la utilizacion de lista enlazadas por limitaciones de memoria, compilo desde netbeans 6.5 para debug en ubuntu 'no se si usara g++ internamente', toda la compilacion es correcta el programa se nutre saticfactoriamente de la esructura celda, pero me indica dos errores en la estructura celda en las funciones inserta y buscarElem. no se si cometo errores ya que anteriormente trabaje con java y puede que arrastre algun vicio que no sea compatible en c++.

class celda
{
private:

int valor;
celda *ptr;

public:

celda(){
valor=-1;
ptr=NULL;
}

celda(int e){
valor=e;
ptr=NULL;
}

void insertar(int e){
if(valor==-1){valor=e;}
while(ptr!=NULL){
28) ptr.insertar(e);
}
ptr=new celda(e);
}


bool buscaElem(int e){
if (ptr==NULL) return(false);
while(valor!=e){
36) return (ptr.buscaElem(e));
}
return (true);
}

};

los errores que me indica en las lineas 28 y 36 son:

newmain.cpp: In member function ‘void celda::insertar(int)’:
newmain.cpp:28: error: solicitud por el miembro ‘insertar’ en ‘((celda*)this)->celda::ptr’, el cual es del tipo ‘celda*’ que no es clase
newmain.cpp: In member function ‘bool celda::buscaElem(int)’:
newmain.cpp:36: error: solicitud por el miembro ‘buscaElem’ en ‘((celda*)this)->celda::ptr’, el cual es del tipo ‘celda*’ que no es clase


gracias de antemano. un saludo.

Yantar
30 de Diciembre del 2008
Tal vez pueda ayudarte, el primier mensaje de error, me parece que se refiere a que no declaras la clase a la que pertenece el método

te envio este algoritmo, tal vez te sirva, lo arme todo en un solo paquete (.cpp) para que no tengas que hacer un proyecto (compilas el cpp y lo haces correr), eso si, no olvides poner los .h en la carpeta configurada como INCLUDE

(podes llamarlo pripila.cpp si queres)

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

#include "pilaDi.h"

void bloque1 (pila &);



nodo::nodo(int dato) {
info=dato; sig=NULL;
}

nodo::~nodo() { cout << "\nNodo destruido... "; }

pila::pila(){ ent=NULL; }
pila::~pila(){ cout << "\npila destruida... "; }

void pila::ponerIz(int dato){
nodo *nuevo= new nodo(dato);
if (!nuevo) exit(1);
if(ent) nuevo->sig=ent;
ent=nuevo;
}
int pila::quitarIz(){
int dato;
nodo *aux;
aux = ent;
dato = aux->info;
ent = ent->sig;
delete aux;
return dato;
}
int pila::sacarIz(int &dato){
if(vacia()) return 0;
dato=quitarIz();
return 1;
}
int pila::vacia(){
if(ent) return 0;
cout <<"\n\nEstructura Vacia";
return 1;
}







int main(){
clrscr(); int sale=0;
pila p1;
bloque1(p1);
cout << "\nTodo bien !!! Intro 1 para salir : "; cin>> sale;
return 0;
}
void bloque1(pila &p1){
int dato=0;
p1.ponerIz(4);
p1.ponerIz(7);
p1.ponerIz(4);
p1.ponerIz(17);
p1.ponerIz(14);
p1.ponerIz(17);
p1.sacarIz(dato);
cout << "dato : " << dato << "\n";

while(p1.sacarIz(dato)){
cout << "dato : " << dato << "\n";
}
}


Ahora van los .h (respeta los nombres que ter paso porque se condicen con lo escrito en el .cpp)

(piladi.h)
#include "nodoDi.h"
class pila{
private:
nodo *ent;

public:
pila();
~pila();
void ponerIz(int);
int quitarIz();
int sacarIz(int &);
int vacia();
};


(nododi.h)
class nodo{

friend class pila;

private:
int info;
nodo *sig;

public:
nodo(int=0);
~nodo();
int getnodo() const {return info;}
};

SUERTE


Yantar
30 de Diciembre del 2008
Veo que se grabó mal, los include de los fuentes no deben continuar con barra, comilla <texto> barra, comilla sino comilla <texto> comilla (las barras no van)

juancxo
30 de Diciembre del 2008
gracias lo de los includes lo tengo claro no te preocupes, pero no entiendo el codigo :( podrias simplificarlo, un programa corto y una implementacion corta, ~ :: & * se mas o menos como se interpretan pero me pierdo soy nuevo en c, gracias. busco por internet pero todo lo k encuentro es similar al codigo que tu escribes pero sin explicaciones exahustivas, pero en los apuntes de mi universidad utiliza la palabra reservda class struct ... pero no hay ningun ejemplo de representacion enlazada. lo siento estoy bastante perdido. toda ayuda se agradece

juancxo
30 de Diciembre del 2008
gracias ya voy cojiendo conceptos que tenia erroneos, bien ahora mismo sin en mi programa principal no utilizo el comando delete no tengo errores, ya tengo la lista implementada, -> es util ;) y definir las cabezeras y las implementaciones fuera de la clase... resuelto eso tengo otro problema
debo utilizarlo para poder volver a utilizar la estructura grafo que utiliza la etructura lista y no colapsar la memoria, libero mam y creo otra estructura. la clase grafo se representa con una tabla de dispersion abierta, es decir un array de [MAX_NODOS] de listas implementadas en celda


class grafo
{

...

grafo();
~grafo();
void inserta(int l, int e);
bool buscarElem( int l, int e );

...

grafo::~grafo()
{

delete[] listas;

}

...

}


la llamada en el main es, dentro de un bucle para resolver un numero variable de laberintos

int main(){

...

grafo *laberinto=new grafo();

...

delete laberinto;
}


el delete es donde produce el error tras una primera buena ejecucion. el error es el siguiente:

*** glibc detected *** ... free(): invalid next size (fast) ...

======= Backtrace: =========
...
======= Memory map: ========
...

el error lo produce cuando el debugger esta en la linea del destructor del tipo grafo, gracias se agradece la ayuda, el programa como imaginaras es para la uni. thank