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

problema con programa pilas

Estas en el tema de problema con programa pilas en el foro de C/C++ en Foros del Web. necesito ayuda, estoy aprendiendo pilas y quiero hacer una pila que en cada nodo tenga una estructura y el puntero hacia el sig. elemento, pero ...
  #1 (permalink)  
Antiguo 19/07/2012, 15:21
 
Fecha de Ingreso: octubre-2009
Mensajes: 25
Antigüedad: 14 años, 5 meses
Puntos: 0
Pregunta problema con programa pilas

necesito ayuda, estoy aprendiendo pilas y quiero hacer una pila que en cada nodo tenga una estructura y el puntero hacia el sig. elemento, pero en la funcion pop tengo errores estoy usando el dev c++, no se si como lo estoy haciendo es correcto o debo usar otro metodo aqui les dejo mi codigo, gracias de antemano por la ayuda.

Código:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct agenda{
    int valor;
   char nombre[30];
   char apellido[30];}; 
 
typedef struct _nodo {
   struct agenda datos;
   struct _nodo *siguiente;
} tipoNodo;

char *nomaux, *apeaux;
int *vaux;
 
typedef tipoNodo *pNodo;
typedef tipoNodo *Pila;
 
/* Funciones con pilas: */
void Push(Pila *l,int pvalor,char papellido[],char pnombre[]);
struct agenda Pop(Pila *l);

int main() {
   struct agenda salida;
   int num,i,val;
   char nom[30],ape[30];
   nomaux=nom;
   apeaux=ape;
   vaux=&val;
   Pila pila = NULL;
   printf("Ingreso de datos de personas, cuantas personas son: \n");
   scanf("%i",&num);
   for(i=0;i<num;i++){
       printf("\n digite el nombre de la persona no. %i",i+1);  
       gets(nom);
       printf("\n digite el apellido de la persona no. %i",i+1);
       gets(ape);
       printf("\n digite la edad de la persona no. %i",i+1); 
       scanf("%i",&val);     
       Push(&pila,val,ape,nom);}              
   getchar();
   return 0;
}

void Push(Pila *pila,int pvalor,char papellido[30],char pnombre[30]){
   pNodo nuevo;
   /* Crear un nodo nuevo */
   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->datos.valor = pvalor;
   strcpy(nuevo->datos.nombre,pnombre);
   strcpy(nuevo->datos.apellido,papellido);
   /* Añadimos la pila a continuación del nuevo nodo */
   nuevo->siguiente = *pila;
   /* Ahora, el comienzo de nuestra pila es en nuevo nodo */
   *pila = nuevo;}

struct agenda Pop(Pila *pila){
   struct agenda salida;    
   pNodo nodo; /* variable auxiliar para manipular nodo */
   /* Nodo apunta al primer elemento de la pila */
   nodo = *pila;
   if(!nodo){
      salida.valor=0;       
      return salida; /* Si no hay nodos en la pila retornamos 0 */} 
   /* Asignamos a pila toda la pila menos el primer elemento */
   *pila = nodo->siguiente;
   /* Guardamos 
   el valor de retorno */
   strcpy(salida.apellido,pila->datos.apellido);
   strcpy(salida.nombre,pila->datos.nombre);
   strcpy(salida.valor,pila->datos.valor);
   /* Borrar el nodo */
   free(nodo);
   return salida;}
me da los sig. errores por cada linea que esta en rojo
`datos' has not been declared
request for member of non-aggregate type before '.' token

Última edición por maur1c10; 19/07/2012 a las 15:43
  #2 (permalink)  
Antiguo 19/07/2012, 16:14
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: problema con programa pilas

Hola maur1c10.

Proba de este modo:
Código C++:
Ver original
  1. ...
  2.   strcpy(salida.apellido, (*pila)->datos.apellido);
  3. ...

Saludos.
  #3 (permalink)  
Antiguo 19/07/2012, 16:19
 
Fecha de Ingreso: diciembre-2010
Mensajes: 77
Antigüedad: 13 años, 3 meses
Puntos: 11
Respuesta: problema con programa pilas

Buenas, prueba con :

Código C++:
Ver original
  1. strcpy(salida.apellido,(*pila)->datos.apellido);
  2. strcpy(salida.nombre,(*pila)->datos.nombre);
  3. salida.valor = (*pila)->datos.valor;

saludos.

EDITO: perdón no vi el post de @ecfisa, posteo mientras estaba mirando el código.
__________________
Convert JSON to CSV
  #4 (permalink)  
Antiguo 19/07/2012, 17:07
 
Fecha de Ingreso: octubre-2009
Mensajes: 25
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: problema con programa pilas

gracias a ambos por la respuesta me sirivio ya pude ejecutar el programa la funcion push funciona bien ahora tengo un problema con la funcion pop lo que sucede es que a la hora de imprimir me muestra los ingresados menos el ultimo (si meto datos de 3 personas muestra datos de dos personas y no de la ultima ingresada) y se sale probe depurando y me dice que tengo una violacion de acceso a la memoria (fallo de segmentacion) en el momento que deberia mostrar al ultimo

aqui el codigo
Código:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct agenda{
    int valor;
   char nombre[30];
   char apellido[30];}; 
 
typedef struct _nodo {
   struct agenda datos;
   struct _nodo *siguiente;
} tipoNodo;

char *nomaux, *apeaux;
int *vaux;
 
typedef tipoNodo *pNodo;
typedef tipoNodo *Pila;
 
/* Funciones con pilas: */
void Push(Pila *l,int pvalor,char papellido[],char pnombre[]);
struct agenda Pop(Pila *l);

int main() {
   struct agenda salida;
   int num,i,val,x=1;
   char nom[30],ape[30];
   nomaux=nom;
   apeaux=ape;
   vaux=&val;
   Pila pila = NULL;
   printf("Ingreso de datos de personas, cuantas personas son: \n");
   scanf("%i",&num);
   for(i=0;i<num;i++){
       printf("\n digite el nombre de la persona no. %i: ",i+1);  
       scanf("%s",nom);
       printf("\n digite el apellido de la persona no. %i: ",i+1);
       scanf("%s",ape);
       printf("\n digite la edad de la persona no. %i: ",i+1); 
       scanf("%i",&val);     
       Push(&pila,val,ape,nom);}
   printf("\n sacando datos de la pila, datos ingresados:");
   salida=Pop(&pila);
   x=salida.valor;
   while(x!=0){   
    printf("\n nombre de la persona %i: %s ",i,salida.nombre);
    printf("\n apellido de la persona %i: %s",i,salida.apellido);
    printf("\n edad de la persona %i: %i",i,salida.valor);    
    salida=Pop(&pila);
    x=salida.valor;              
    }                  
   getchar();
   return 0;
}

void Push(Pila *pila,int pvalor,char papellido[30],char pnombre[30]){
   pNodo nuevo;
   /* Crear un nodo nuevo */
   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->datos.valor = pvalor;
   strcpy(nuevo->datos.nombre,pnombre);
   strcpy(nuevo->datos.apellido,papellido);
   /* Añadimos la pila a continuación del nuevo nodo */
   nuevo->siguiente = *pila;
   /* Ahora, el comienzo de nuestra pila es en nuevo nodo */
   *pila = nuevo;}

struct agenda Pop(Pila *pila){
   struct agenda salida;    
   pNodo nodo; /* variable auxiliar para manipular nodo */
   /* Nodo apunta al primer elemento de la pila */
   nodo = *pila;
   if(!nodo){
      salida.valor=0;
      strcpy(salida.nombre,"x");
      strcpy(salida.apellido,"x");       
      return salida; /* Si no hay nodos en la pila retornamos 0 */} 
   /* Asignamos a pila toda la pila menos el primer elemento */
   *pila = nodo->siguiente;
   /* Guardamos 
   el valor de retorno */
   strcpy(salida.apellido,(*pila)->datos.apellido);
   strcpy(salida.nombre,(*pila)->datos.nombre);
   salida.valor=(*pila)->datos.valor;
   /* Borrar el nodo */
   free(nodo);
   return salida;}

Última edición por maur1c10; 19/07/2012 a las 17:16
  #5 (permalink)  
Antiguo 19/07/2012, 19:17
 
Fecha de Ingreso: diciembre-2010
Mensajes: 77
Antigüedad: 13 años, 3 meses
Puntos: 11
Respuesta: problema con programa pilas

Para guardar los datos de retorno, debes usar la variable nodo, ya que antes de guardar el valor, haces :

Código C++:
Ver original
  1. *pila = nodo->siguiente;

Por lo que quiere decir, que ahora pila apunta al siguiente nodo, y cuando quiere mostrar el ultimo nodo (que no tiene siguiente nodo), nodo->siguiente es igual a NULL, y cuando llamas a strcpy :

Código C++:
Ver original
  1. strcpy(salida.apellido,(*pila)->datos.apellido);

Te da error de violacion de acceso, porque (*pila) es un puntero que no apunta a ningun sitio.

El codigo correcto es :

Código C++:
Ver original
  1. strcpy(salida.apellido,nodo->datos.apellido);
  2. strcpy(salida.nombre,nodo->datos.nombre);
  3. salida.valor=nodo->datos.valor;

Nose si me explique bien xD

Saludos.
__________________
Convert JSON to CSV
  #6 (permalink)  
Antiguo 19/07/2012, 19:53
 
Fecha de Ingreso: octubre-2009
Mensajes: 25
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: problema con programa pilas

gracias por la ayuda si me sirvio y si comprendo la parte de que trabajo con el nodo, solo que ahora no se porque el programa se cierra y rapidamente despues de mostrar los mensajes y no tengo errores luego de ver con el depurador, gracias de nuevo
tambien probe usando getch() pero lo mismo (estoy usando dev c++)
  #7 (permalink)  
Antiguo 19/07/2012, 20:44
 
Fecha de Ingreso: diciembre-2010
Mensajes: 77
Antigüedad: 13 años, 3 meses
Puntos: 11
Respuesta: problema con programa pilas

Si estas en windows, la manera mas facil es reemplazar el getchar por

Código C++:
Ver original
  1. system("PAUSE");

Si estas en algun otro sistema operativo (también funciona en windows) y quieres usar getchar(), puedes hacerlo así :

Código C++:
Ver original
  1. fflush(stdin);
__________________
Convert JSON to CSV
  #8 (permalink)  
Antiguo 19/07/2012, 21:08
 
Fecha de Ingreso: octubre-2009
Mensajes: 25
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: problema con programa pilas

muchas gracias ecfisa y a versinlimites por ayudarme con tanto ya me funciona bien al final lo de getchar() era por como estaba usando el Pop(), gracias de nuevo

aqui dejo el codigo por si le sirve a alguien:
Código:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct agenda{
    int valor;
   char nombre[30];
   char apellido[30];}; 
 
typedef struct _nodo {
   struct agenda datos;
   struct _nodo *siguiente;
} tipoNodo;

char *nomaux, *apeaux;
int *vaux;
 
typedef tipoNodo *pNodo;
typedef tipoNodo *Pila;
 
/* Funciones con pilas: */
void Push(Pila *l,int pvalor,char papellido[],char pnombre[]);
struct agenda Pop(Pila *l);

int main() {
   struct agenda salida;
   int num,i=0,val,x=1;
   char nom[30],ape[30];
   nomaux=nom;
   apeaux=ape;
   vaux=&val;
   Pila pila = NULL;
   printf("Ingreso de datos de personas, cuantas personas son: \n");
   scanf("%i",&num);
   for(i=0;i<num;i++){
       printf("\n digite el nombre de la persona no. %i: ",i+1);  
       scanf("%s",nom);
       printf("\n digite el apellido de la persona no. %i: ",i+1);
       scanf("%s",ape);
       printf("\n digite la edad de la persona no. %i: ",i+1); 
       scanf("%i",&val);     
       Push(&pila,val,ape,nom);}
   printf("\n sacando datos de la pila, datos ingresados:");
   i=0;
   while(x!=0){
    salida=Pop(&pila);
    x=salida.valor;
    if(x!=0){                
    printf("\n nombre de la persona %i+1: %s ",i,salida.nombre);
    printf("\n apellido de la persona %i+1: %s",i,salida.apellido);
    printf("\n edad de la persona %i: %i+1",i,salida.valor);}   
    i++;              
    }                  
   fflush(stdin);
   getchar();
   return 0;
}

void Push(Pila *pila,int pvalor,char papellido[30],char pnombre[30]){
   pNodo nuevo;
   /* Crear un nodo nuevo */
   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->datos.valor = pvalor;
   strcpy(nuevo->datos.nombre,pnombre);
   strcpy(nuevo->datos.apellido,papellido);
   /* Añadimos la pila a continuación del nuevo nodo */
   nuevo->siguiente = *pila;
   /* Ahora, el comienzo de nuestra pila es en nuevo nodo */
   *pila = nuevo;}

struct agenda Pop(Pila *pila){
   struct agenda salida;    
   pNodo nodo; /* variable auxiliar para manipular nodo */
   /* Nodo apunta al primer elemento de la pila */
   nodo = *pila;
   if(!nodo){
      salida.valor=0;
      strcpy(salida.nombre,"x");
      strcpy(salida.apellido,"x");       
      return salida; /* Si no hay nodos en la pila retornamos 0 */} 
   /* Asignamos a pila toda la pila menos el primer elemento */
   *pila = nodo->siguiente;
   /* Guardamos 
   el valor de retorno */
   strcpy(salida.apellido,nodo->datos.apellido);
   strcpy(salida.nombre,nodo->datos.nombre);
   salida.valor=nodo->datos.valor;
   /* Borrar el nodo */
   free(nodo);
   return salida;}

Etiquetas: funcion, int, pilas, programa, string, struct, variables
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 16:53.