FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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; } 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; } Salu2
__________________
Novato en busqueda de Avance |
#2
|
||||
|
||||
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. Última edición por escafandra fecha: 11-04-2008 a las 00:49:55. |
#3
|
||||
|
||||
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...
__________________
Novato en busqueda de Avance |
#4
|
||||
|
||||
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; } Última edición por escafandra fecha: 10-04-2008 a las 19:17:32. |
#5
|
||||
|
||||
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.
pues con esta forma tambien solo me imprime la ultima paguina y necesito que se impriman todos.
__________________
Novato en busqueda de Avance Última edición por ramphi fecha: 11-04-2008 a las 18:22:56. Razón: falta de especificacion |
#6
|
||||
|
||||
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. |
#7
|
||||
|
||||
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#8
|
||||
|
||||
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. |
#9
|
||||
|
||||
ok
en realidad estoy usando c++, intentare todo lo que me sugieren y luego les digo como me fue.
gracias por la ayuda.
__________________
Novato en busqueda de Avance Última edición por ramphi fecha: 12-04-2008 a las 23:02:04. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Estructura de un CD | david duarte | Varios | 4 | 27-10-2005 17:48:50 |
Actualizar estructura | Garada | Firebird e Interbase | 2 | 15-10-2004 08:34:40 |
estructura de una tabla | Salomon | Firebird e Interbase | 3 | 14-05-2004 15:26:46 |
Averiguar estructura de frm | brandolin | MySQL | 0 | 20-10-2003 22:23:57 |
Imprimir Estructura | agora18 | Conexión con bases de datos | 3 | 07-10-2003 19:19:22 |
|