Pls What am I doing wrong.

I am using am array to make a data structure were I save the data that cames from the user.

That Part is working,

But when I try to show the data intruduced I get strange results, as if the data hasn' t been saved correctly.

First file:

Code:
#include <stdio.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#include "biblioteca.h"
#include "records.h"


int add_rec(){


     char ch;
     struct records aux;


     /* Lê os elementos e cria o registo antes do o introduzir na base de dados */
     printf("(Obrigatório) Titulo : ");
     gets(aux.titulo);


     printf("Sub Titulo : ");
     gets(aux.subtitulo);


     printf("Autor : ");
     gets(aux.autoria);


     printf("(Obrigatório) Local de Edição : ");
     gets(aux.local_edicao);


     printf("Editora : ");
     gets(aux.editora);


     //Alterar
     printf("Ano de edição : ");
     scanf("%d",&(aux.ano_edicao));


     /* Código para limpar o buffer antes de ler o caracter */
     while ((ch = getchar()) != '\n' && ch != EOF) {}
     printf("Cota : ");
     gets(aux.cota);


     printf("(Obrigatório) Preço : ");
     scanf("%f",&(aux.preco));


     aux.status = '*';


     if (add_record(&aux) == 0){
        printf("Registo inserido\n");
        return 0;
     } else {
        printf("Erro a inserir registo\n");
        return -1;
     }
}


void menu(){


     char option, ch;


     option = '0';


     while (option != 'X'){
         printf("\n");
         printf("--------------\n");
         printf("Menu Principal\n");
         printf("--------------\n");
         printf("\n\n");


         printf("A - Adicionar Registo\n");
         printf("B - Editar Registo\n");
         printf("C - Remover Registo\n");
         printf("P - Pesquisas\n");
         printf("L - Listagens\n");
         printf("I - Importar Registos\n");
         printf("E - Exportar Registos\n");
         printf("Z - !!!Reinicializar a Base Bibligráfica!!!\n");
         printf("\n\n");
         printf("X - Sair\n");
         printf("\n\n");
         printf("Opção : ");


         scanf("%c",&option);
         /* Código para limpar o buffer antes de ler o caracter */
         while ((ch = getchar()) != '\n' && ch != EOF) {}


         switch(option){
                case 'A':
                     add_rec(); /* Criar verificação da introdução dos dados */
                     /* Código para limpar o buffer antes de ler o caracter */
                     while ((ch = getchar()) != '\n' && ch != EOF) {}
                     break;
                case 'B':
                     break;
                case 'C':
                     break;
                case 'P':
                     menu_pesquisas();
                     break;
                case 'L':
                     menu_listagens();
                     break;
                case 'I':
                     break;
                case 'E':
                     break;
                case 'Z':
                     break;
                case 'X':
                     return;
                     break;
                default:
                     printf("-----------------\n");
                     printf("Opção inexistente\n");
                     printf("-----------------\n\n\n");
         }
     }


} /* Function menu - end  */


void menu_pesquisas(){


     char option, ch;


     option = '0';


     while (option != 'X'){
         printf("\n");
         printf("--------------\n");
         printf("Menu Pesquisas\n");
         printf("--------------\n");
         printf("\n\n");


         printf("1 - Pesquisar: por Título\n");
         printf("2 - Pesquisar: por Autoria\n");
         printf("3 - Pesquisar: por Listagens\n");
         printf("\n\n");
         printf("X - Sair\n");
         printf("\n\n");
         printf("Opção : ");


         scanf("%c",&option);
         /* Código para limpar o buffer antes de ler o caracter */
         while ((ch = getchar()) != '\n' && ch != EOF) {}


         switch(option){
                case '1':
                     break;
                case '2':
                     break;
                case '3':
                     break;
                case 'X':
                     return;
                     break;
                default:
                     printf("-----------------\n");
                     printf("Opção inexistente\n");
                     printf("-----------------\n\n\n");
         }
     }
}


void menu_listagens(){


     char option, ch;


     option = '0';


     while (option != 'X'){
         printf("\n");
         printf("--------------\n");
         printf("Menu Listagens\n");
         printf("--------------\n");
         printf("\n\n");


         printf("1 - Listagem: Sequencial\n");
         printf("2 - Listagem: Ordenada por Título\n");
         printf("3 - Listagem: Ordenada por Autoria\n");
         printf("\n\n");
         printf("X - Sair\n");
         printf("\n\n");
         printf("Opção : ");


         scanf("%c",&option);
         /* Código para limpar o buffer antes de ler o caracter */
         while ((ch = getchar()) != '\n' && ch != EOF) {}


         switch(option){
                case '1':
                     mostra_registo();
                     break;
                case '2':
                     break;
                case '3':
                     break;
                case 'X':
                     return;
                     break;
                default:
                     printf("-----------------\n");
                     printf("Opção inexistente\n");
                     printf("-----------------\n\n\n");
         }
     }
}


int main(){


     setlocale(LC_ALL, "");


     menu();


     return 0;


}
Second File
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "records.h"


/* Tenho que criar uma variável que é um array de tamanho desconhecido, sempre que ler uma registo
 * terei que alocar memória para o guardar no registo */
struct records *rec;
int elementos = 0; /* Numero de elementos no registo */


int add_record(struct records *elem){


    struct records *temp;


    temp = realloc(rec, sizeof(struct records *));
    /* Verifica se houve boa alocação de memória */
    if (temp == NULL){
       strcpy(erro,"Erro na alocação de memória\n");  /* Especifica o erro */
       return -1; /* Indica erro */
    }


    elementos += 1;
    rec = temp;


    temp = temp + elementos;






    /* Falta verificar se o registo é duplicado */


    /* cópia de cada um dos elementos */
    strcpy(temp->titulo , elem->titulo);
    strcpy(temp->subtitulo , elem->subtitulo);
    strcpy(temp->autoria , elem->autoria);
    strcpy(temp->local_edicao , elem->local_edicao);
    strcpy(temp->editora , elem->editora);
    strcpy(temp->cota , elem->cota);
    temp->status  = '*';
    temp->ano_edicao = elem->ano_edicao;
    temp->preco = elem->preco;


         printf("%s",temp->titulo);
         if (strlen(temp->subtitulo) > 0)
              printf(" : %s",temp->subtitulo);
         if (strlen(temp->autoria) > 0)
              printf(" / %s",temp->autoria);
         printf(". ");
         printf("%s",temp->local_edicao);
         if (strlen(temp->editora) > 0)
            printf(" : %s",temp->editora);
         printf(", %d",temp->ano_edicao);
         printf(". ");
         if (strlen(temp->cota) > 0)
              printf("Cota: %s",temp->cota);
         printf(" - Preco: %.2f",temp->preco);
         printf(".\n");


    return 0; /* Sem erros */


}


void mostra_registo(){


    struct records *temp;
    //Fails to show things right why????
    int i;


    temp = rec;


    for (i = 1; i < elementos + 1; i++){
         temp++;
         printf("%s",temp->titulo);
         if (strlen(temp->subtitulo) > 0)
              printf(" : %s",temp->subtitulo);
         if (strlen(temp->autoria) > 0)
              printf(" / %s",temp->autoria);
         printf(". ");
         printf("%s",temp->local_edicao);
         if (strlen(temp->editora) > 0)
            printf(" : %s",temp->editora);
         printf(", %d",temp->ano_edicao);
         printf(". ");
         if (strlen(temp->cota) > 0)
              printf("Cota: %s",temp->cota);
         printf(" - Preço: %.2f",temp->preco);
         printf(".\n");
    }
}
Last needed file

Code:
/* Estrutura de dados */


struct records{


       /* As variáveis de texto tem tamanho fixo, reduzindo a complexidade do programa */
       char titulo[120];
       char subtitulo[120];
       char autoria[80];
       char local_edicao[30];
       char editora[30];
       int ano_edicao;
       char cota[30];
       float preco;
       char status;


};


/* Variável onde se guardam os erros */
char erro[100];


/* Funções */
int add_record(struct records *elem);
void mostra_registo();