Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/07/2015, 01:17
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: parentesis balanceados

Buenos días.

Lo primero, revisa las normas del foro... el código hay que decorarlo con la etiqueta que corresponda... elige el lenguaje en cuestión en el desplegable "Highlight" y pon el código dentro de las etiquetas.

Y ahora, tratando tu problema, empezamos con un consejo. En la siguiente función:

Código C:
Ver original
  1. Pila *creaPila(){
  2.   Pila *nvo=(Pila *)malloc(sizeof(Pila));
  3.   nvo->cab=NULL;
  4.   return nvo;
  5. }

Puedes conseguir lo mismito haciendo:


Código C:
Ver original
  1. Pila *creaPila(){
  2.   Pila *nvo=(Pila *)calloc(1, sizeof(Pila));
  3.   return nvo;
  4. }

calloc es una función un poco más completa que malloc ya que además de reservar la memoria, inicializa la memoria reservada a 0, con lo que nvo->cab acabará apuntando a NULL sin tener que hacer nada más.

¿Por qué usar calloc en vez de malloc? porque si, en el futuro, añades nuevos punteros a la estructura, calloc se encargará de resetear toda la memoria, mientras que si usas malloc tendrás que acordarte de actualizar esta función a mano.

Luego comentas que no se añaden los elementos a la pila. Deberías hacer caso de los warning que te salen en el código. Veamos:

Código C:
Ver original
  1. char cad[100];
  2. scanf("%s",&cad);

cad es un puntero, luego ese & sobra. Lo que estás escribiendo ya te digo yo que no va a dónde tu esperas que vaya.

Código C:
Ver original
  1. struct nodoL{
  2.     void **dato;
  3.     struct nodoL *sig;
  4. };
  5.  
  6. NodoL *creaNodoL(void *dato, NodoL *cab){
  7.   nvo->dato=dato; // <<--- puntero doble = puntero???
  8. }

Aquí tenemos el ejemplo contrario... por qué dato es un puntero doble? Si tiene que ser un puntero doble no le puedes asignar un puntero simple así por las buenas.

Y para terminar....

Código C:
Ver original
  1. void *pop(Pila *p){
  2.   eliminaIni(&(p->cab));
  3. }

pop retorna un void*, luego ahí falta un return... o sobra el asterisco.

Deberías revisar el tema del doble puntero, ya que la solución cambia dependiendo de si nodoL->dato es un puntero doble o no.

Un saludo