Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con listas enlazadas

Estas en el tema de Problema con listas enlazadas en el foro de C/C++ en Foros del Web. Que tal, estoy realizando un programa con listas enlazadas, pero tengo un error en mi funcion que inserta un nuevo nodo en la lista, parte ...
  #1 (permalink)  
Antiguo 16/12/2006, 12:53
Avatar de BLEND  
Fecha de Ingreso: marzo-2006
Mensajes: 97
Antigüedad: 18 años, 1 mes
Puntos: 0
Mensaje Problema con listas enlazadas

Que tal, estoy realizando un programa con listas enlazadas, pero tengo un error en mi funcion que inserta un nuevo nodo en la lista, parte de mi codigo es este:

Cita:
struct stNodo
{
int dato;
stNodo *enlace;
};

typedef stNodo* ApuntaNodo;

// dentro del main tengo esto:

ApuntaNodo cabeza;
cabeza = new stNodo;
cabeza->dato = 1;
cabeza->enlace = NULL;

// Para agregar un nuevo nodo esta es mi funcion:

insertar_cabeza(ApuntaNodo& cabeza, int el_numero);

// al declarar la funcion, me marca el error que coloque mas a bajo

void insertar_cabeza(ApuntaNodo& cabeza, int el_numero)
segun yo y mis apuntes esta bien la sintaxis, pero al compilarlo me marca un error, al parecer en la direccion, pero como no soy bueno con el ingles les escribo lo que me aparece jejejeje:

Cita:
expected primary-espression before '&' token
si me pueden ayudar les agradeceria infinitamente, por si no me explique bien, el error me lo marca en la funcion no en el main.


Saludos...
  #2 (permalink)  
Antiguo 16/12/2006, 13:50
Avatar de BLEND  
Fecha de Ingreso: marzo-2006
Mensajes: 97
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Problema con listas enlazadas

Que tal, ya pude resolver mi problema, tenia mal declarada la llamada a mi funcion.

Otra cosa, al utilizar new tengo que utilizar delete o no, por ejemplo:

Cita:
ApuntaNodo cabeza;
cabeza = new stNodo;

// Tengo que eliminar el objeto

delete(cabeza);
agradeceria sus respuestas, ya que en las FAQ'S, solo enonctre sobre malloc/free
  #3 (permalink)  
Antiguo 16/12/2006, 15:06
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Problema con listas enlazadas

Para cada new debe haber su delete correspondiente.
  #4 (permalink)  
Antiguo 16/12/2006, 16:26
Avatar de BLEND  
Fecha de Ingreso: marzo-2006
Mensajes: 97
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Problema con listas enlazadas

Hey Max, pero por ejemplo en este codigo que tengo, como se supone que elimino la variable apTemp2, ya que si coloco el delete(apTemp2), tengo conflictos a la ora de visualizar mis datos, ya que, creo yo, los nodos se pierden, entonces si no lo elimino no hay problema, y siquiero eliminarla fuera del case, ya no puedo hacerlo, lo tendria que hacer mejor con una funcion o algo asi.

Cita:
#include <stdio.h>
#include <stdlib.h>

struct stNodo
{
int dato;
stNodo *sig;
};

typedef stNodo* apNodo;

int main()
{
int opc,num;
apNodo cabeza = new stNodo;
if(!cabeza)
{
printf("ERROR: no hay suficiente memoria disponible");
exit(1);
}
cabeza->dato = 0;
cabeza->sig = NULL;
do
{
printf("\n1.- Ingresa");
printf("\n2.- Visualiza");
printf("\n3.- Salir");
scanf("%d",&opc);
switch(opc)
{
case 1:
apNodo apTemp = new stNodo;
if(!apTemp)
{
printf("ERROR: No hay memoria suficiente");
exit(1);
}
system("cls");
printf("Numero: ");
scanf("%d",&num);
apTemp->dato = num;
apTemp->sig = cabeza;
cabeza = apTemp;
//delete apTemp;
break;
case 2:
apNodo apTemp2 = new stNodo;
if(!apTemp2)
{
printf("ERROR: No hay memoria suficiente");
exit(1);
}
apTemp2 = cabeza;
while(apTemp2->sig)
{
printf("Dato: %d\n",apTemp2->dato);
apTemp2 = apTemp2->sig;
}
system("pause");
delete apTemp2;
break;
}
}while(opc != 3);
delete cabeza;
system("pause");
return 0;
}
disculpen si el codigo es algo ambiguo, solo estoy practicando.

Otra duda, que diferencia existe entre utilizar el malloc/free y el new/delete, ya que a mi se me hace mas facil manejar las listas enlazadas con new/delete, gracias.


Saludos.
  #5 (permalink)  
Antiguo 16/12/2006, 17:30
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Problema con listas enlazadas

Estas programando en C, no en C++.

Debes usar solo malloc y free. New y delete son exclusivamente de C++.

int *x = malloc(5 * sizeof(x));
...
free(x);
  #6 (permalink)  
Antiguo 16/12/2006, 18:07
Avatar de BLEND  
Fecha de Ingreso: marzo-2006
Mensajes: 97
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Problema con listas enlazadas

Pero si es permitido mezclar C con C++, o se tiene que seguir esos entandares ?
  #7 (permalink)  
Antiguo 16/12/2006, 18:39
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Problema con listas enlazadas

C es una cosa.
C++ es otra cosa.

Si mezclas, obtendrás algo que, aunque te funcione a ti, ni es estándar, ni portable, ni nada.

Cualquier exposición pública de tu código sería rechazada.

En privado, haz lo que quieras :)
  #8 (permalink)  
Antiguo 16/12/2006, 19:40
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Problema con listas enlazadas

Ahi si noe stoy muy de acuerdo.

Una cosa es saber diferenciar sobr elos lenguajes y otra mezclarlos.
Y en mi opinion no hay ningun problema al mezclarlos, siempre y cuando no hagas un revoltijo de hacer "new" y luego "free".
Yo acostumbro a dividir mis programas en modulos unos escritos en C++ y otros en C. O incluso usar caracteristicas de C y de C++ en un mismo modulo.
no pasa nada, es legible, funciona y es aceptado.

Efectivamente son 2 lenguajes diferentes aunque en si son un conjunto y no veo el problema en juntarlos sino, para eso usaria Java en vez de C++.

Saludos
  #9 (permalink)  
Antiguo 16/12/2006, 19:45
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Problema con listas enlazadas

Cita:
Iniciado por Instru Ver Mensaje
Yo acostumbro a dividir mis programas en modulos unos escritos en C++ y otros en C.
Eso no es mezclarlo. Una vez el código ha sido convertido en un objeto (.o), da igual.

Cita:
O incluso usar caracteristicas de C y de C++ en un mismo modulo.
no pasa nada, es legible, funciona y es aceptado.
En eso ya no estoy de acuerdo. :P

Esto no es muy claro, pese a que funcione:

Código:
char x[] = "Hola C.\n";
std::string y("Hola C++.\n");
char *z = new char[strlen(x) + strlen(y.c_str())];
strcpy(z, y.c_str());
strcat(z, x);
std::cout << z << '\n' << std:.endl;
free(z);
Y en cualquier caso, aunque C++ soporte en general C, pueden aparecer más problemas...
  #10 (permalink)  
Antiguo 16/12/2006, 19:53
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Problema con listas enlazadas

Jajjaja. Eso es hacer batido de C y de C++. Yo no hablo de ese tipo de mezclas, digo si voy a usar chars uso chars y nada mas, si voy a usar la clase string pues nada mas eso y ya. A lo que me refiero con la mezclar es por ejemplo crear una clase con chars dentro de ella, usar true y false(aunque al parecer ya estan en el estandar C99). Usa un poco la STl en un programa que a simple vista es C. Cosas asi.
Lo que tu pusiste es revolver, lo que si no se debe hacer, de lo que hablo es mezclar inteligentemente.

Saludos.
  #11 (permalink)  
Antiguo 16/12/2006, 21:22
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Problema con listas enlazadas

Cita:
Iniciado por Instru Ver Mensaje
Jajjaja. Eso es hacer batido de C y de C++. Yo no hablo de ese tipo de mezclas, digo si voy a usar chars uso chars y nada mas, si voy a usar la clase string pues nada mas eso y ya. A lo que me refiero con la mezclar es por ejemplo crear una clase con chars dentro de ella, usar true y false(aunque al parecer ya estan en el estandar C99). Usa un poco la STl en un programa que a simple vista es C. Cosas asi.
Lo que tu pusiste es revolver, lo que si no se debe hacer, de lo que hablo es mezclar inteligentemente.
Para usar "const", namespaces, "inline", y otras sutilezas, es que estás usando C++.

Recordemos que C++ tiene 3 paradigmas, no tiene porqué aparecer una clase o template.
  #12 (permalink)  
Antiguo 17/12/2006, 04:19
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Problema con listas enlazadas

Tu problema no es con el uso de la memoria dinamica(en este caso new y delete), sino en tu algoritmo en sí.

tu cabeza que se supone tiene que ser el primer nodo en realidad es el ultimo, por estar usano algo muy similar al algoritmo de ordenacion de burbuja. ademas tus supuestos nodos apTemp en realidad no los usas como temporales sino que en realidad ellos forman tu lista es por eso que al eliminarlos te elimina tus datos.

no para el uso de new y delete sino para la implementacion de tus listas sería bueno que implementaras unas funciones que realicen una veraddera tarrea de llenado de lista.(enlazar nodos).
un error agregado es la declaracion de variables dentro de los bloques case: para poder hacerlo tienes que crear un bloque {} para que tus variables puedan ser destruidas al abandonar el bloque.
en tu caso usas punteros que manualmete eliminarias, pero aun asi es recomendable usar un bloque {}o en su caso usar una funcion.

en tu caso en particular, parese que tu codigo esta basado en C, por tanto seria bueno que siguieras asi.
si fuese lo contrario no seria tan estricto.
Un compilador de C no permite codigo C++, pero un compilador de C++ si permite codigo de C.
  #13 (permalink)  
Antiguo 17/12/2006, 10:44
Avatar de BLEND  
Fecha de Ingreso: marzo-2006
Mensajes: 97
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Problema con listas enlazadas

¡¡¡ Hey muchas gracias por todos lo comentarios !!!, de verdad que es bueno saber todo ese tipo de cosas que dificilmente ve uno en la escuela, y solo se logra aprender preguntando a la gente con mayor experiencia.

Cita:
char x[] = "Hola C.\n";
std::string y("Hola C++.\n");
char *z = new char[strlen(x) + strlen(y.c_str())];
strcpy(z, y.c_str());
strcat(z, x);
std::cout << z << '\n' << std:.endl;
free(z);
Tampoco me referia a eso MaxExtreme ;P jajaja, como menciona Instru, no quiero mezclarlo nadamas por que si, si no llevar una sintaxis logica y sistematica de lo que realmente quiero hacer. El detalle que tenia era saber cual era esa diferencia.

Una ultima peticion, si es que se puede, he buscado cual es la diferencia exacta entre C y C++, ce que la pregunta es un poco trillada, pero en realidad no entiendo muy bien cual sea la diferencia, y tambien acerca de los Estandares.

Tambien gracias Nivel7, el codigo que coloque lo hice como prueba, aunque pense que estaba bien, ya veo que no ;P, gracias por los comentarios.

Saludos.
  #14 (permalink)  
Antiguo 17/12/2006, 13:06
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Problema con listas enlazadas

Cita:
Iniciado por BLEND Ver Mensaje
cual es la diferencia exacta entre C y C++
Demasiadas. En resumidas cuantas:

1. Tenemos C, que tiene el paradigma estructurado.
2. Luego apareció C++, que es un C con dos nuevos paradigmas: Programación Orientada a Objetos y Programación Genérica (o con plantillas); además de otras mil cosas.

Tu problema es que estás mezclando cosas de C y C++. Las funciones que usas y en general el estilo que utilizas es C.

Sin embargo, usas "new" y "delete", que sólo existen en C++.
  #15 (permalink)  
Antiguo 17/12/2006, 13:51
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Problema con listas enlazadas

HEY!!! QUE PASA esa pregunta esta super explicada en las FAQs.....
Se nota que no las has checado.

Saludos
  #16 (permalink)  
Antiguo 17/12/2006, 17:20
Avatar de BLEND  
Fecha de Ingreso: marzo-2006
Mensajes: 97
Antigüedad: 18 años, 1 mes
Puntos: 0
Re: Problema con listas enlazadas

Cita:
HEY!!! QUE PASA esa pregunta esta super explicada en las FAQs.....
Se nota que no las has checado.
Pues que crees Instru que ya las habia leido, pero igual y no puse atencion, chale, las revisare y creo que me queda mas claro revisar las FAQ's antes de postear algo ;P jejejeje.


Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:08.