Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   problema en estructura (https://www.clubdelphi.com/foros/showthread.php?t=55116)

ramphi 08-04-2008 19:52:35

problema en estructura
 
hola gente como estan, les escribo por la siguiente duda.

Estoy realizando una estructura de datos en pila pero se me ha presentado el siguiente problema cuando inserto los valores directamente desde modo de edicion todo va bien, pero cuando utilizo una sentencia gets(). para capturar los datos por teclado con un ciclo y guardarlos el programa solo imprime el ultimo dato: y quiero que los imprima todos no solo el ultimo ahora les pongo el codigo que utilize para la estructura:

Código:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _nodo{
        char *url;
        struct _nodo *siguiente;
        }TipoNodo;
       
typedef TipoNodo *pNodo;
typedef TipoNodo *Pila;

void Push(Pila *l,char *web);
char* Pop(Pila *l);

int main(){
  Pila pila= NULL;
 
  printf("Introdusca la paguina web a visitar\n");
  Push(&pila,"www.gmail.com");
  Push(&pila,"www.yahoo.com");
  Push(&pila,"www.teniente.com");
 
  while(pila!=NULL){
  printf("%s\n",Pop(&pila));
 
}
 
  printf("Final presione una tecla para continuar...");
  getch();
  return 0; 
    }

void Push(Pila *pila,char *web){
  pNodo nuevo;
  nuevo= (pNodo)malloc(sizeof(TipoNodo));
  nuevo->url= web;
  nuevo->siguiente= *pila;
  *pila=nuevo;
}

char* Pop(Pila *pila){
      pNodo nodo;
      char *val;
      nodo=*pila;
      if(!nodo) return "Vacio";
      *pila= nodo->siguiente;
      val=nodo->url;
      free(nodo);
      return val;
      }

este codigo funciona bien pero cuando intento hacer la introduccion de los valores en un ciclo solo me impreime el ultimo valor y de vez en cuando el programa se cierra y no me da error ninguno:

Código:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _nodo{
        char *url;
        struct _nodo *siguiente;
        }TipoNodo;
       
typedef TipoNodo *pNodo;
typedef TipoNodo *Pila;

void Push(Pila *l,char *web);
char* Pop(Pila *l);

int main(){
  Pila pila= NULL;
  char *t="dentro";

do
{
  printf("Introdusca la paguina web a visitar\n");
  gets(t);
  Push(&pila,t);
  } while(strcmp(t,"salir"));
 
  while(pila!=NULL){
  printf("%s\n",Pop(&pila));
}
 
  printf("Final presione una tecla para continuar...");
  getch();
  return 0; 
    }

void Push(Pila *pila,char *web){
  pNodo nuevo;
  nuevo= (pNodo)malloc(sizeof(TipoNodo));
  nuevo->url= web;
  nuevo->siguiente= *pila;
  *pila=nuevo;
}

char* Pop(Pila *pila){
      pNodo nodo;
      char *val;
      nodo=*pila;
      if(!nodo) return "Vacio";
      *pila= nodo->siguiente;
      val=nodo->url;
      free(nodo);
      return val;
      }

hay algun error que he cometido y como puedo solucinar el problema.
Salu2

escafandra 09-04-2008 21:29:16

Desde mi punto de vista tienes dos errores:
1) Asumes que el resultado de gets(t), es decir t, no va a cambiar. La realidad es que si cambia, por lo que apunta siempre a la última cadena introducida por teclado.

2) El bucle del printf está mal planteado, por eso obtienes un error, como el Pop lo haces después de comprobar si pila es nulo, en el ultimo elemento pila pasa a ser cero y ejecuta el printf pila->url, siendo pila NULL => ERROR.

La estructura del Push y Pop esta bien planteada.

Mira este código, basado en el tuyo.
Código:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _nodo{
        char *url;
        int n;
        struct _nodo *siguiente;
        }TipoNodo;

typedef TipoNodo *pNodo;
typedef TipoNodo *Pila;

void Push(Pila *l,char *web);
char* Pop(Pila *l);

int main(){
  Pila pila= NULL;
  char *t="dentro";

do{
  printf("Introdusca la paguina web a visitar\n");
  gets(t);
  Push(&pila,t);
} while(strcmp(t,"salir"));

  while(pila->siguiente!=NULL){
  Pop(&pila);
  printf("%d\n",pila->n);
}

  printf("Final presione una tecla para continuar...");
  getch();
  return 0; 
    }

void Push(Pila *pila,char *web){
  pNodo nuevo;
  nuevo= (pNodo)malloc(sizeof(TipoNodo));
  if(*pila==0) nuevo->n=0;
  else nuevo->n=(*pila)->n+1;
  nuevo->url= web;
  nuevo->siguiente= *pila;
  *pila=nuevo;
}

char* Pop(Pila *pila){
      pNodo nodo;
      char *val;
      nodo=*pila;
      if(!nodo) return "Vacio";
      *pila= nodo->siguiente;
      val=nodo->url;
      free(nodo);
      return val;
}



Saludos.

ramphi 10-04-2008 16:28:56

otra cosa
 
gracias por la ayuda, pero sigo teniendo problemas en en bucle de Push cuando intento introducir un valor por teclado en el bucle me sigue dando error en esta parte

Código:

do{
  printf("Introdusca la paguina web a visitar\n");
  gets(t);
  Push(&pila,t);
} while(strcmp(t,"salir"));


esta parte del codigo dara problemas o es mi compilador de c++ que estara dando problemas...

escafandra 10-04-2008 19:04:20

Claro, gets(t), utiliza t como un buffer, como lo has definido como char* t = "dentro"; apunta a la cadena dentro, de 6 caracteres. Aquí vas a guardar las cadenas que introduzcas por el teclado. Si te pasas de caracteres... ERROR en tiempo de ejecución. Por otro lado, siempre apunta a la última cadena.

Prueba esto y te darás cuenta:

Código:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _nodo{
        char *url;
        int n;
        struct _nodo *siguiente;
        }TipoNodo;

typedef TipoNodo *pNodo;
typedef TipoNodo *Pila;

void Push(Pila *l,char *web);
char* Pop(Pila *l);

int main(){
  Pila pila= NULL;
  char t[256]; // buffer de 255 caracteres + /0

do{
  printf("Introduzca la pagina web a visitar\n");
  gets(t);
  // t siempre apunta al buffer, por lo que siempre apilas un puntero que apunta al buffer que es la última cadena...
  Push(&pila,t); 
} while(strcmp(t,"salir"));  // "salir" también ha sido apilada, por lo que es la última cadena y la UNICA que printf puede ver...

while(pila->siguiente!=NULL){
  Pop(&pila);
  printf("%d %s\n",pila->n, pila->url);
}


  printf("Final presione una tecla para continuar...");
  getch();
  return 0; 
    }

void Push(Pila *pila,char *web){
  pNodo nuevo;
  nuevo= (pNodo)malloc(sizeof(TipoNodo));
  if(*pila==0) nuevo->n=0;
  else nuevo->n=(*pila)->n+1;
  nuevo->url= web;
  nuevo->siguiente= *pila;
  *pila=nuevo;
}

char* Pop(Pila *pila){
      pNodo nodo;
      char *val;
      nodo=*pila;
      if(!nodo) return "Vacio";
      *pila= nodo->siguiente;
      val=nodo->url;
      free(nodo);
      return val;
}

Saludos.

ramphi 11-04-2008 18:21:42

problema en estructura
 
bien ya he comprendido esa parte pero entonces, como puedo hacer para que no se pierdan los valores introducidos y puedan ser impresos al final.:confused:

pues con esta forma tambien solo me imprime la ultima paguina y necesito que se impriman todos.

escafandra 12-04-2008 01:32:27

Pues tienes dos formas. O reservas espacio para las cadenas url en la estructura url[256] o lo asignas dinámicamente y lo liberas al desapilar.
Por supuento, entonces, el almacenaje de las cadenas lo harás con un strcpy, y no con una asignación de puntero.

Si en lugar de usar C, usas C++ es mas fácil el uso de los operadores new y delete.

Saludos. ;)

Lepe 12-04-2008 01:57:53

OFFTOPIC: En Delphi (y por tanto también en C++) existen clases que implementan las pilas (FIFO) y colas (LIFO), de memoria creo recordar:
TStackqueue
Tqueue

y sé que hay algunas más, en la ayuda o en la unidad classes estarán.

Si tienes que implementarlo tú, pues ajo y agua ;).

Saludos

escafandra 12-04-2008 11:30:14

Me da la impresión de que tiene que implementarlo él, además, esta usando C y no C++ (por la forma de asignar memoria...), si es así, no puede usar las VCL.

Saludos.

ramphi 12-04-2008 22:57:52

ok
 
en realidad estoy usando c++, intentare todo lo que me sugieren y luego les digo como me fue.

gracias por la ayuda.


La franja horaria es GMT +2. Ahora son las 05:41:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi