#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct contato {
      char *nome;
      char endereco[50];
      int telefone;
      char email[30];
};
typedef struct contato Contato;

void listar_contatos(Contato *v, int q) {
    int i;
    for (i=0; i<q; i++) {
        printf("\nContato %d => %s|%s|%d|%s \n", i+1,
            v[i].nome,v[i].endereco,v[i].telefone,v[i].email);
    }
}

int pesquisar_nome(Contato *v, int q, char *nome) {
    int i;
    for (i=0; i<q; i++) {
        if (strcmp(v[i].nome,nome)==0) {
            printf("\nEncontrado: Contato %d => %s|%s|%d|%s \n", i+1,
                v[i].nome,v[i].endereco,v[i].telefone,v[i].email);
            return 0;
        }
    }
    printf("\nContato nao encontrado!\n");
    return 1;
}

int pesquisar_telefone(Contato *v, int q, int telefone) {
    int i;
    for (i=0; i<q; i++) {
        if (v[i].telefone == telefone) {
            printf("\nEncontrado: Contato %d => %s|%s|%d|%s \n", i+1,
                v[i].nome,v[i].endereco,v[i].telefone,v[i].email);
            return 0;
        }
    }
    printf("\nContato nao encontrado!\n");
    return 1;
}

int main(void)
{
    Contato *vContatos; // vetor de contatos
    int quant; // tamanho do vetor de contatos

    printf("\nQuantos contatos deseja cadastrar? ");
    scanf("%d", &quant);

    // alocacao dinamica do vetor
    vContatos = (Contato *) malloc(sizeof(Contato)*quant);
    // cadastro dos contatos
    int i;
    for (i=0; i<quant; i++) {
        printf("\nContato %d - digite nome: ", i+1);
        // alocacao dinamica do nome
        vContatos[i].nome = (char *) malloc(sizeof(char)*50);
        scanf(" %50[^\n]%*c", vContatos[i].nome);

        printf("\nContato %d - digite endereco: ", i+1);
        scanf(" %50[^\n]%*c", vContatos[i].endereco);

        printf("\nContato %d - digite telefone: ", i+1);
        scanf("%d", &(vContatos[i].telefone));

        printf("\nContato %d - digite email: ", i+1);
        scanf(" %30[^\n]%*c", vContatos[i].email);
    }

    int opcao;
    char nome[50];
    int telefone;
    do {
        printf("\nEscolha uma opcao:");
        printf("\n1 - Listar contatos");
        printf("\n2 - Pesquisar por nome");
        printf("\n3 - Pesquisar por telefone");
        printf("\n4 - Sair\n=> ");
        scanf("%d", &opcao);
        switch (opcao) {
            case 1:
                listar_contatos(vContatos, quant);
                break;
            case 2:
                printf("\nDigite o nome desejado: ");
                scanf(" %50[^\n]%*c", nome);
                pesquisar_nome(vContatos, quant, nome);
                break;
            case 3:
                printf("\nDigite o telefone desejado: ");
                scanf("%d", &telefone);
                pesquisar_telefone(vContatos, quant, telefone);
                break;
            case 4:
                for (i=0; i<quant; i++)
                    free(vContatos[i].nome);
                free(vContatos);
                printf("\nTchau!\n");
                break;
            default:
                printf("\nOpcao invalida. Tente novamente.\n");
        }
    } while (opcao != 4);

    system("pause");
    return 0;
}