codice:
double weight_com; //<------------ quì

	assert(tracts /* check the function arguments */ & (cnt >= 0) && (index >= 0)); 
	if (cnt <= 1) 
	{ /* if only one transaction left */ 
		n = (cnt > 0) ? (*tracts)->cnt -index : 0; 
		tat = (TATREE*)malloc(sizeof(TATREE) +(n-1) *sizeof(int)); 
		if (!tat) 
			return NULL; /* create a transaction tree node */ 
		tat->cnt = cnt; /* and initialize its fields */ 
		tat->size = -n; 
		tat->max = n; 
		(*tracts)->weight_tran= weight_com;  /// <------- quì
		while (--n >= 0) 
			tat->items[n] = (*tracts)->items[index +n]; 
		return tat; 
	}
Anche così è abbastanza difficile capire perchè le informazioni sono comunque poche, però una cosa strana l'ho notata:

Nella riga in basso dove ho scritto "quì" fai un'assegnazione con weight_com che è stato dichiarato ma non inizializzato in alcun modo,quindi questo non può voler dire nulla di buono.Se come mi sembra di intuire il valore di (*tracts)->weight_tran lo devi calcolare in base al valore nella chiamata ricorsiva precedente,weight_com deve essere un parametro non una variabile locale.se lo lasci così qualche problema c'è di sicuro anche se non è proprio il tuo problema magari,percheè al momento dell'assegnazione weight_com contiene solo spazzatura.