Ver Mensaje Individual
  #4  
Antiguo 10-04-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 10-04-2008 a las 19:17:32.
Responder Con Cita