[ Foro de C ]

duda con pilas

19-Jul-2012 03:55
mauricio vk
3 Respuestas

tengo una duda con pilas y es que no se si se puede usar en los nodos mas de un dato en los ejemplos que he visto en muchas partes el nodo solo tiene el puntero a siguiente y un dato, ¿podria hacer un nodo en el que ese dato tenga una estructura completa con varios datos, por ejemplo para hacer una pila que almacene datos de personas?
por ej. tengo lo sig. en dev C++

struct agenda{
   int valor;
  char nombre[30];
  char apellido[30];  
      }

typedef struct _nodo {
  struct agenda datos;
  struct _nodo *siguiente;
} tipoNodo;  //aqui me indica error

y en la parte que indico arriba me da el sig. error:
two or more data types in declaration of `tipoNodo'

esa es mi duda, gracias de antemano a quien me pueda ayudar


19-Jul-2012 04:05
mauricio vk

me respondo a mi mismo me falta un ; :-)  V-.  xx-P voy a seguir con el programa y les comento como me va


19-Jul-2012 19:46
mauricio vk

ya he avanzado pero tengo problemas con la funcion pop donde quiero devolver un struct a ver si me ayudan con eso tengo error en la parte en la que quiero sacar los valores de la pila este es el programa del ejemplo que hay aqui pero editado

#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);
//error datos has not been declared, request for member of non-aggregate type before '.' token
  strcpy(salida.nombre,pila->datos.nombre);  //error
  strcpy(salida.valor,pila->datos.valor);  //error
  /* Borrar el nodo */
  free(nodo);
  return salida;}


22-Jul-2012 22:50
Nacho Cabanes (+83)

Mauricio, tu fuente ha salido descuadrado y le faltan los "include".

En cualquier caso, como recomendación básica: Sé progresivo: comienza por lo más básica y ve ampliado poco a poco.

Si en este ejercicio lo que quieres es practicar el uso de pilas, olvídate de structs y de cadenas de texto, y empieza por una pila de enteros.

Yo incluso empezaría por crear una "pila estática", es decir, imitar el funcionamiento de una pila usando internamente un array, y comprobar que todo se comporta correctamente. Después cambias los detalles internos, para que use memoria dinámica. Si todo sigue funcionando, entonces usas datos más complejos que un entero: en primer lugar una cadena de texto, y luego un "struct".






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)