allora, ho da letto come funzionano le liste...e i problemi iniziano gia a farsi sentire,

posto tutto il codice:

codice:
#include <stdio.h>
#include <stdlib.h>


struct ele
{
 int a;
 struct ele *next;
};

struct lista
{
 int num_ele;
 struct ele *top;
};


void inizial (struct lista *lis);
void ins_ele (int dato, struct lista *lis);
void del_ele (struct lista *lis);
 int estrai(struct lista *lis);
 int leggi (struct lista *lis);

main()
{
 system("color 0a");
 int i,j,k,h;
 
 struct ele *n;
 n =(struct ele *)malloc(sizeof(struct ele));                    
 
 struct lista *p;
 p =(struct lista *)malloc(sizeof(struct lista));          
 inizial(&(*p));           
 
 printf("\n\n\tCaricamento della lista\n");


printf("Inserire il numero degli elementi che si desidera inserire:");
scanf("%d",&i);

 for (j=1;j<=i;j++)
 {
  printf("Inserire elemento:");
  scanf("%d",k);
  ins_ele(k,&(*p));
 };
 system("cls");
 printf("\n\n\tCaricamnt Eseguito.\n");
 system("pause");
 system("cls");
  printf("\n\n\tEstrazione Lista:\n");
 
 while (p->num_ele!=0)
 {
   h = estrai(&(*p));
   printf("Elemento estratto: %d\n", h); /* Qui e il Problema*/
 }; 
 printf("\n\n");
 system("pause");        
};


void inizial(struct lista *lis)
{
 lis->num_ele=0;
 lis->top=NULL;
     
};



void ins_ele (int dato, struct lista *lis)
{
 struct ele *n;
 n = (struct ele *)malloc(sizeof(struct ele));
 if (n == NULL)
        { 
          system("cls");  
          printf("\n\n\n\t\tMemoria non sufficente, il programma verra\' arrestato!\n\n\n\n\n");
          system("pause");
          exit(1);
        }
                       
 n->a = dato;
 n->next =lis->top;
 lis->top = n;
 lis->num_ele++ ;   
};

void del_ele (struct lista *lis)
{
     struct ele *n;
     lis->num_ele--;
     n=lis->top;
     lis->top=n->next;
     free(n);
};

int leggi (struct lista *lis)
{
    struct ele *n;
    lis->top=n;
    int b = n->a;
    
    return(b);
};

int estrai(struct lista *lis)
{
 struct ele *n;
 int z;
 
 n=lis->top;
 z=n->a;
 lis->top = lis->top->next;
 lis->num_ele--;
 
 free(n);   
 return z;   
}

come si può ben notare e un classico programma per caricare e scaricare una lista..niente di che, il problema e allo scaricamento, infatti nel ciclo while in cui iene eseguita n volte la funzione estrai(struct lista *lis) la restituzione è la locazione di memoria di a [overo la variabile della struttura Elemento contenente il dato]

e da 2 ore ke ci sto sopra.....aiuto