esattamente che tipo di errore dà?

inoltre se sei alle prime armi, non userei con tanta allegria la funzione gets() ._.
se dai qualche informazione in più sull'erorre o sul comportamento anonimo dell'esecuzione del programma, forse si riesce a capire quale parte del codice è buggato.

Inoltre consiglio: nel main() ci va il minimo ed indispensabile. il main è solo il punto di partenza, non il programma intero. oltre al fatto che suddividendo il codice in più funzioni, il programma 1- è più leggibile e 2- è più facile da capire dove sono eventuali errori, in quanto li isoli dal resto del programma.