Ayuda con el siguiente codigo en c ya que no me marca error pero creo que no esta agregando correctamente los elementos a la pila. 
(es necesario usar la pila con una estructura tal cual y tambien los NodoL)
El programa debe analizar una funcion dada por el usuario y decir si los parentesis, corchetes y llaves estan balanceados; es decir, si la funcion tiene un "(" que haya un ")" y asi con los demas. 
 
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct nodoL{
       void **dato;
       struct nodoL *sig;
};
typedef struct nodoL NodoL;
 
struct pila{
       NodoL *cab;
};
typedef struct pila Pila;
 
Pila *creaPila(){
     Pila *nvo=(Pila *)malloc(sizeof(Pila));
     nvo->cab=NULL;
     return nvo;
}
 
NodoL *creaNodoL(void *dato, NodoL *cab){
      NodoL *nvo=(NodoL *)malloc(sizeof(NodoL));
      nvo->dato=dato;
      nvo->sig=cab;
      return nvo;
}
 
void insertaIni(void *dato, NodoL **cab){
     *cab=creaNodoL(dato,*cab);
}
 
NodoL *eliminaIni(NodoL **cab){
      NodoL *p;
      if(*cab==NULL)
                    return NULL;
      p=*cab;
      *cab=p->sig;
      p->sig=NULL;
      return p;
} 
 
void push(Pila *p, void *dato){
     insertaIni(dato,&(p->cab));
}
 
void *pop(Pila *p){
     eliminaIni(&(p->cab));
}
 
int pila_vacia(Pila *pila)
{
    return pila==NULL;
}
 
char *creaChar(char c){
	char *nvo=(char*)malloc(sizeof(char));
	*nvo=c;
	return nvo;
}
 
int verifi(char cad[], char ca, char cc){
    int i=0, bal=1;
    Pila *p;
    p=creaPila();
    while(cad[i]!='\0' && bal==1){
        if(cad[i]==ca){
            push(p,(void*)creaChar(cad[i]));
        }
        else{
            if(cad[i]==cc){
                if(pila_vacia(p)!=1){
                    pop(p);
                }
                else{
                    bal=0;
                }
            }
        }
        i++;
    }
    if(bal==1 && pila_vacia(p)!=1){
              bal=0;
    }
    while(pila_vacia(p)!=1){
                           pop(p);
    }
    return bal; 
}
 
int main(){
    char cad[100];
    printf("\n\t....Verificacion de parentesis, corchetes y llaves balanceados....\n\n\n");
    printf("Ingrese funcion: ");
    scanf("%s",&cad);
    if (verifi(cad,'(',')')==1)
                                 printf("\n\n\nParentesis balanceados");
    else
                                 printf("\n\nParentesis no balanceados");
    if (verifi(cad,'[',']')==1)
                                 printf("\n\nCorchetes balanceados");
    else
                                 printf("\n\nCorchetes no balanceados");
    if (verifi(cad,'{','}')==1)
                                 printf("\n\nLlaves balanceadas\n\n\n");
    else
                                 printf("\n\nLlaves no balanceadass\n\n\n");
    system("pause");
    return 0;
} 
   
 
 parentesis balanceados
 parentesis balanceados 

