elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con lista doblemente enlazada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con lista doblemente enlazada  (Leído 2,830 veces)
gibi77

Desconectado Desconectado

Mensajes: 19


Ver Perfil
ayuda con lista doblemente enlazada
« en: 7 Marzo 2012, 04:03 am »

AYUDA!! TENGO PROBLEMA AL empezar A DAR DE ALTA, Y NO SE COMO ARREGLARLO... ADJUNTO MIS DOS CLASES LA PRIMERA ES LA (.h) Y LA SEGUNDA ES LA (.cpp) EN EL CPP ES EL ERROR, AHI EN EL CODIGO PONGO EL ERROR, (JUSTAMENTE AHI NO CONTINUA EL PROGRAMA), POR CIERTO aún NO HE TERMINADO EL CODIGO XD

class CLDL
{
   struct NodoLDL{
      char Renglon [30];
      NodoLDL *SIG,*ANT;
   }*Ini,*Act;//*Ini=0;
   char LeeOP(),LeeValor(int);
   int RecorreLDL();
   void AltaLDL(char),RUN(),BajaLDL();
public:
   CLDL(void);
   ~CLDL(void);
}ElPrograma;
////////////////////////////////////////
#include "LDL.h"
#include <stdio.h>
#include <conio.h>
#include <ctype.h>

char CLDL::LeeOP(){
   printf("Direccion de inicio: %d\n A]lta\n B]aja\n U]p\n D]own\n S]alir\n Pulse opcion: \n ",Ini);
   return toupper(getche());
}
char CLDL::LeeValor(int que){
   char Valor[30];
   printf("Escriba el valor a %s \n",que?"Eliminar":"Dar de alta");
   scanf("%s",Valor);
   return Valor[30];

}
void CLDL::AltaLDL(char Valor){
   NodoLDL*NVO= new NodoLDL;
   if(!NVO)return;
   NVO->Renglon[30]=Valor;
   NVO->SIG=Act->SIG;// AL EJECUTAR ME MANDA ERROR AQUI!!
   NVO->ANT=Act;
   Act->SIG->ANT=NVO;
   Act->SIG=NVO;
   Act=NVO;
}
void CLDL::BajaLDL(){
   Act->ANT->SIG=Act->SIG;
   Act->SIG->ANT=Act->ANT;
   delete Act;//????
}
void CLDL::RUN(){
   char Op;
   while((Op=LeeOP())!='S')
      switch(Op){
         case 'A':AltaLDL(LeeValor(0));
            break;
         case 'B':BajaLDL();
            break;
         case 'U':break;
         case 'D':break;
   }
}

CLDL::CLDL(void)
{
   Ini=0;
   Act=0;
   RUN();
}

CLDL::~CLDL(void)
{
   /*while(ini){

   }*/
}
void main(){}


En línea

nirvguy

Desconectado Desconectado

Mensajes: 23



Ver Perfil
Re: ayuda con lista doblemente enlazada
« Respuesta #1 en: 7 Marzo 2012, 07:29 am »

gibi77 me puse a revisar tu código. Y tengo un par de sugerencias, y una para arreglar tu error de ejecución.
Las sugerencias:

La primera:
Cuando defines e implementas la función LeeValor(int) lo haces asi
Código
  1. char LeeValor(int)
  2. //(LA IMPLEMENTACION)
  3. char CLDL::LeeValor(int que){
  4.   char Valor[30];
  5.   printf("Escriba el valor a %s \n",que?"Eliminar":"Dar de alta");
  6.   scanf("%s",Valor);
  7.   return Valor[30];
  8.  
  9. }
  10.  
¿Porque char LeeValor(int)? deberia ser char* LeerValor(int) al igual que en la implementación, ya que lo que supuse que tu querías devolver era una cadena de caracteres no un solo caracter.

Segunda sugerencia:
Siempre que uses scanf utiliza fflush para asegurarte que el buffer de entrada se limpie.

Tercera sugerencia:
Código
  1. return Valor[30];
  2.  
Estarías devolviendo el caracter en la posición 30. Deberias hacerlo asi
Código
  1. return Valor;
  2.  
Aunque igual este erroneo porque estas pasando un puntero de una variable que se va destruir en seguida termine. Sabiendo que utilizas C++ usa string de la STL para no complicarte con los punteros, aunque igual se puede con chars.

Cuarta sugerencia:
Nunca te olvides de inicializar todos los miembros privados de tus clases, aunque a veces de igual, otras es crucial. Asi que mejor siempre hacerlo a menos que el lenguaje te lo haga por ti pero este no es el caso, con los punteros, por ejemplo, si no le pones un constructor a NodoLDL (la unica función que se le puede poner a los constructores, si mal no recuerdo) para que SIG y ANT marquen NULL al igual que Ini y Act (que se que los pusiste como NULL o 0 que es lo mismo).Eso te sirve ademas para comprobar si hay siguiente, si hay anterior, ya que si no tienen NULL no se sabe.

Quita sugerencia:
Para la funcion AltaLDL que tambien le pusiste como argumento char debiendo ser char*
Nunca compies una cadena a sangre fria así. Jeje
Código
  1. NVO->Renglon[30]=Valor;
  2.  
Si quisieras copiar un caracter eso esta bien, pero no es lo que supongo que querías ya que la estructura NodoLDL tiene a renglon como cadena no como caracter. Yo lo haria así. Dime si me equivoco.
Código
  1. strcpy(NVO->Renglon,Valor)
  2.  

Sexta sugerencia:
En la misma función AltaLDL
Código
  1. NodoLDL*NVO= new NodoLDL;
  2. if(!NVO)return;
  3. NVO->Renglon[30]=Valor;
  4. NVO->SIG=Act->SIG;
  5. NVO->ANT=Act;
  6. Act->SIG->ANT=NVO;
  7. Act->SIG=NVO;
  8. Act=NVO;
  9.  
Salta el error en ejecucion ahi porque estas intentando modificar el contenido de una porcion de la memoria que no tiene nada asignado. Estoy hablando de Act cuando recien ejecutas el programa Act tiene NULL y no tiene una estructura NodoLDL asignada ni nada. Por eso es que cuando haces Act->SIG finaliza, porque no tiene la estructura en esa porcion de memoria para referirse ni a un SIG ni a un ANT. Y despues hay un par de errores como no fijarte justamente eso, si la lista esta vacía, si esta vacía tienes que proceder de otra forma para insertar un nodo. Bueno en fin te pongo como yo lo escribi.
Código
  1. void CLDL::AltaLDL(char Valor[30]) {
  2.    NodoLDL*NVO=new NoodoLDL;
  3.    ///ACA TENDRIAS QUE EN REALIDAD MANDAR UN MENSAJE DE ERROR PERO COMO DIJISTE QUE NO LO TERMINASTE, NO HAY PROB
  4.    if(!NVO) return;
  5.    strcpy(NVO->Renglon,Valor);
  6.    //esto,nada para volver al primer nodo
  7.    if(Act) while(Act->ANT) Act = Act->ANT;
  8.    //Lo que te decia, fijate si existe el primer nodo
  9.    if(!Act) {
  10.        NVO->ANT = NULL;
  11.        NVO->SIG = Act;
  12.        Act = NVO;
  13.   } else {
  14.        NVO->SIG = Act->SIG;
  15.        Act->SIG=NVO;
  16.        NVO->ANT=Act;
  17.        Act = NVO;
  18.        if(NVO->SIG) NVO->SIG->ANT = NVO;
  19.   }
  20. }
  21.  
Lo podrías escribir mejor pero yo lo hice así no más, en cuanto a la ejecucion me fije si no se interrumpia y no se interrumpio, pero en cuanto al funcionamiento no me fije mucho. Ah, y me olvide algo te conviene que cuando rebobinas el puntero actual
trabajes con una copia para devolverlo a su lugar luego.

Espero haberte ayudado, disculpá si mi comentario fue muy largo, es que cuando tengo sueño redundo, jeje. Siento si me fije en todo,  :-X soy muy obsesivo. Debería irme a dormir. Bueno, en fin saludos.


En línea

Todas mis letras han sido pedazos de poesía y los pedazos de poesía se toman de poemas que comúnmente no tienen sentido
en primer termino.
               Kurt Cobain
gibi77

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: ayuda con lista doblemente enlazada
« Respuesta #2 en: 7 Marzo 2012, 07:40 am »

nirvguy, respuestas muy concretas  ;-), justo lo que nesecitaba me lo haz resuelto, como veras no soy muy bueno programando y gracias a estos comentarios puedo darme cuenta de los errores garrafales que cometo, gracias y espero ya no atorarme jaja.
En línea

nirvguy

Desconectado Desconectado

Mensajes: 23



Ver Perfil
Re: ayuda con lista doblemente enlazada
« Respuesta #3 en: 7 Marzo 2012, 07:47 am »

No hay problema, espero yo, no haberte atormentado. A todos nos pasan esos errores bobos cuando empezamos, cuando estamos a la mitad y cuando terminamos, por despitaos, jeje. Saludos.
En línea

Todas mis letras han sido pedazos de poesía y los pedazos de poesía se toman de poemas que comúnmente no tienen sentido
en primer termino.
               Kurt Cobain
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
una lista circular doblemente enlazada en c sharp c#
.NET (C#, VB.NET, ASP)
neo_angel_xxx 2 7,837 Último mensaje 29 Octubre 2010, 01:48 am
por [D4N93R]
ayuda...Lista doblemente enlazada
Java
goll9d 2 2,902 Último mensaje 22 Enero 2012, 04:50 am
por goll9d
Ayuda con lista doblemente enlazada
Programación C/C++
falconez 2 7,583 Último mensaje 16 Diciembre 2013, 01:35 am
por falconez
Ordenar strings de analisis de fechas en lista doblemente enlazada.
Programación C/C++
falconez 1 1,564 Último mensaje 16 Junio 2014, 09:21 am
por eferion
Insertar enmedio de una lista doblemente enlazada
Programación C/C++
BrendiisFox 3 2,472 Último mensaje 16 Septiembre 2015, 21:05 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines