Questa e' un mio esempio (scritto velocemente) ... spero non ci siano bug ...

codice:
typedef struct numeriDifib
{
   int num;
   struct numeriDifib *suc;
} Nf;

int fib(int num)	
{
  return (num < 2 ? num : fib(num-1) + fib(num-2));
}

Nf *creaListaFib(int n)
{
  int i;
  Nf *pHead=NULL, **ppNewItem;

  if(n==0) return(NULL);

  pHead = (Nf *)malloc(sizeof(Nf));
  pHead->num = fib(1);
  pHead->suc = NULL;
  ppNewItem = &pHead->suc;

  for(i=2; i<=n; i++)
  {
    (*ppNewItem) = (Nf *)malloc(sizeof(Nf));
    (*ppNewItem)->num = fib(i);
    (*ppNewItem)->suc = NULL;

    ppNewItem = &((*ppNewItem)->suc);
  }

  return(pHead);
}

int main(void)
{
  Nf *fib = creaListaFib(30);
  Nf *tmp = fib;

  do
  {
    printf("%d\n", tmp->num);
    tmp = tmp->suc;
  } while(tmp);

  return 0;
}
E' una implementazione inefficiente (e capirai il perche' da solo) ma piu' "elegante" ...