Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Gustavo.A.Barroso

C Problema Alocação Dinâmica e realocação de Struct em C

Recommended Posts

Tenho o seguinte código:

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

typedef struct
{
    char nome[30];
    char email[30];
    char telefone[30];
} agenda;

agenda* alocar();
void cadastro(agenda*, int *);
int realocar(agenda *, int);
void consultar(agenda *,int);
void alterar(agenda *, int);
void pesquisar(agenda *, int);



int main()
{
    int resp;
    int i = 0;

    agenda *p = alocar();

    while (resp != 9)
    {
        printf("\n1 - Cadastrar");
        //printf("\n2 - Alterar");
        printf("\n3 - Consultar");
       // printf("\n4 - Excluir");
       // printf("\n5 - Pesquisar");
        printf("\n9 - Sair\n");
        printf("--> ");
        scanf("%d",&resp);
        fflush(stdin);

        if (resp == 1)
        {
            cadastro(p,&i);
        }
        else if(resp == 2)
        {
            //alterar(p,&i);
        }
        else if(resp == 3)
        {
            consultar(p,i);
        }
        else if(resp == 4)
        {
            //excluir(p,i);
        }
        else if(resp == 5)
        {
            //pesquisar(p,i);
        }
        else
        {
        };
    }

    return 0;
}

agenda* alocar()
{
    agenda *p = (agenda*) malloc(1*sizeof(agenda));
    if (p!= NULL)
    {
        return p;
    }
    else
    {
        printf("\nMEMORIA INSUFICIENTE\n");
        exit(1);
    }
}

int realocar(agenda *p,int i)
{
    p = (agenda*) realloc(p,i*sizeof(agenda));
    if(p!= NULL)
    {
        printf("\nRealocado com sucesso!");
        return 1;
    }
    else
    {
        printf("\nN foi possivel realocar!");
        return 0;
    }
}

void cadastro(agenda*p, int *i)
{

    int resp;
    int j = *i;

    printf("Digite o nome: ");
    gets(p[j].nome);
    printf("Digite o email: ");
    gets(p[j].email);
    printf("Digite um telefone: ");
    gets(p[j].telefone);
    j++;
    *i = j;

    printf("\nCadastrar mais (s-1/n-0): ");
    scanf("%d",&resp);
    system("cls");
    while (resp == 1)
    {
        realocar(p,j);
        fflush(stdin);
        printf("\nDigite o nome: ");
        gets(p[j].nome);
        printf("Digite o email: ");
        gets(p[j].email);
        printf("Digite um telefone: ");
        gets(p[j].telefone);
        printf("\nCadastrar mais (s-1/n-0): ");
        scanf("%d",&resp);
    }
}

void consultar(agenda *p, int i)
{
    int k;
    for (k = 0; k <= i; k++)
    {
        printf("\nNome: %s",p[k].nome);
        printf("\nEmail: %s",p[k].email);
        printf("\nTelefone: %s",p[k].telefone);
    }

}

Tentei de tudo a a função cadastro e Consultar não funcionam, quando eu cadastro, os dados se sobrescrevem !!! Alguém tem alguma ideia? sou novo em Estruturas de dados e ta muito complicado entender .

adicionado 0 minutos depois
agora, Gustavo.A.Barroso disse:

Tenho o seguinte código:


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

typedef struct
{
    char nome[30];
    char email[30];
    char telefone[30];
} agenda;

agenda* alocar();
void cadastro(agenda*, int *);
int realocar(agenda *, int);
void consultar(agenda *,int);
void alterar(agenda *, int);
void pesquisar(agenda *, int);



int main()
{
    int resp;
    int i = 0;

    agenda *p = alocar();

    while (resp != 9)
    {
        printf("\n1 - Cadastrar");
        //printf("\n2 - Alterar");
        printf("\n3 - Consultar");
       // printf("\n4 - Excluir");
       // printf("\n5 - Pesquisar");
        printf("\n9 - Sair\n");
        printf("--> ");
        scanf("%d",&resp);
        fflush(stdin);

        if (resp == 1)
        {
            cadastro(p,&i);
        }
        else if(resp == 2)
        {
            //alterar(p,&i);
        }
        else if(resp == 3)
        {
            consultar(p,i);
        }
        else if(resp == 4)
        {
            //excluir(p,i);
        }
        else if(resp == 5)
        {
            //pesquisar(p,i);
        }
        else
        {
        };
    }

    return 0;
}

agenda* alocar()
{
    agenda *p = (agenda*) malloc(1*sizeof(agenda));
    if (p!= NULL)
    {
        return p;
    }
    else
    {
        printf("\nMEMORIA INSUFICIENTE\n");
        exit(1);
    }
}

int realocar(agenda *p,int i)
{
    p = (agenda*) realloc(p,i*sizeof(agenda));
    if(p!= NULL)
    {
        printf("\nRealocado com sucesso!");
        return 1;
    }
    else
    {
        printf("\nN foi possivel realocar!");
        return 0;
    }
}

void cadastro(agenda*p, int *i)
{

    int resp;
    int j = *i;

    printf("Digite o nome: ");
    gets(p[j].nome);
    printf("Digite o email: ");
    gets(p[j].email);
    printf("Digite um telefone: ");
    gets(p[j].telefone);
    j++;
    *i = j;

    printf("\nCadastrar mais (s-1/n-0): ");
    scanf("%d",&resp);
    system("cls");
    while (resp == 1)
    {
        realocar(p,j);
        fflush(stdin);
        printf("\nDigite o nome: ");
        gets(p[j].nome);
        printf("Digite o email: ");
        gets(p[j].email);
        printf("Digite um telefone: ");
        gets(p[j].telefone);
        printf("\nCadastrar mais (s-1/n-0): ");
        scanf("%d",&resp);
    }
}

void consultar(agenda *p, int i)
{
    int k;
    for (k = 0; k <= i; k++)
    {
        printf("\nNome: %s",p[k].nome);
        printf("\nEmail: %s",p[k].email);
        printf("\nTelefone: %s",p[k].telefone);
    }

}

Tentei de tudo a a função cadastro e Consultar não funcionam, quando eu cadastro, os dados se sobrescrevem !!! Alguém tem alguma ideia? sou novo em Estruturas de dados e ta muito complicado entender .

Não coloquei todas as funções porque iria ficar muito grande ..

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

typedef struct
{
    char nome[30];
    char email[30];
    char telefone[20];
} agenda;

agenda* alocar();
void cadastro(agenda*, int *);
int realocar(agenda *, int);
void consultar(agenda *,int);

int main()
{
    int resp;
    int i = 0;

    agenda *p = alocar();

    while (resp != 9)
    {
        printf("\n1 - Cadastrar");
        //printf("\n2 - Alterar");
        printf("\n3 - Consultar");
       // printf("\n4 - Excluir");
       // printf("\n5 - Pesquisar");
        printf("\n9 - Sair\n");
        printf("--> ");
        scanf("%d",&resp);
        fflush(stdin);

        switch(resp){
        case 1:
            cadastro(p,&i);
            break;

        case 3:
            consultar(p,i);
            break;

        case 9:
            break;

        default:
            printf("Opcao invalida! ");
        }

        printf("\n\nPressione ENTER para continuar...");
        getchar();
        system("cls");
    }

    return 0;
}

agenda* alocar()
{
    agenda *p = (agenda*) malloc(1*sizeof(agenda));
    if (p!= NULL)
    {
        return p;
    }
    else
    {
        printf("\nMEMORIA INSUFICIENTE\n");
        exit(1);
    }
}

int realocar(agenda *p,int i)
{
    p = (agenda*) realloc(p,i*sizeof(agenda));
    if(p!= NULL)
    {
        //printf("\nRealocado com sucesso!");
        return 1;
    }
    else
    {
        //printf("\nN foi possivel realocar!");
        return 0;
    }
}

void cadastro(agenda*p, int *i)
{
    if(!realocar(p, *i+1)){ // se não conseguir realocar
        printf("\nN foi possivel adicionar novo contato!");
        return;
    }
    //int resp;
    int j = *i;

    printf("Digite o nome: ");
    gets(p[j].nome);
    printf("Digite o email: ");
    gets(p[j].email);
    printf("Digite um telefone: ");
    gets(p[j].telefone);
    j++;
    *i = j;
    /*printf("\nCadastrar mais (s-1/n-0): ");
    scanf("%d",&resp);
    system("cls");
    while (resp == 1)
    {
        realocar(p,j);
        fflush(stdin);
        printf("\nDigite o nome: ");
        gets(p[j].nome);
        printf("Digite o email: ");
        gets(p[j].email);
        printf("Digite um telefone: ");
        gets(p[j].telefone);
        printf("\nCadastrar mais (s-1/n-0): ");
        scanf("%d",&resp);
    }//*/
}

void consultar(agenda *p, int i)
{
    if(i == 0)
    {
        printf("\nSem registro!\n");
        return;
    }

    int k;
    for (k = 0; k < i; k++)
    {
        printf("\nID: %03d", k);
        printf("\nNome: %s",p[k].nome);
        printf("\nEmail: %s",p[k].email);
        printf("\nTelefone: %s\n",p[k].telefone);
    }
}

@Gustavo.A.Barroso talvez esse código já te ajude, dei uma alterada em umas partes, da pra melhorar mais, poderia acrescentar um ponteiro para o próximo contado da agenda dentro da struct e um ponteiro global pro ultimo elemento (isso se você já aprendeu a mexer com pilha/lista)

Editado por Relry PeSan

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 6 horas atrás, Relry PeSan disse:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    typedef struct
    {
        char nome[30];
        char email[30];
        char telefone[20];
    } agenda;
    
    agenda* alocar();
    void cadastro(agenda*, int *);
    int realocar(agenda *, int);
    void consultar(agenda *,int);
    
    int main()
    {
        int resp;
        int i = 0;
    
        agenda *p = alocar();
    
        while (resp != 9)
        {
            printf("\n1 - Cadastrar");
            //printf("\n2 - Alterar");
            printf("\n3 - Consultar");
           // printf("\n4 - Excluir");
           // printf("\n5 - Pesquisar");
            printf("\n9 - Sair\n");
            printf("--> ");
            scanf("%d",&resp);
            fflush(stdin);
    
            switch(resp){
            case 1:
                cadastro(p,&i);
                break;
    
            case 3:
                consultar(p,i);
                break;
    
            case 9:
                break;
    
            default:
                printf("Opcao invalida! ");
            }
    
            printf("\n\nPressione ENTER para continuar...");
            getchar();
            system("cls");
        }
    
        return 0;
    }
    
    agenda* alocar()
    {
        agenda *p = (agenda*) malloc(1*sizeof(agenda));
        if (p!= NULL)
        {
            return p;
        }
        else
        {
            printf("\nMEMORIA INSUFICIENTE\n");
            exit(1);
        }
    }
    
    int realocar(agenda *p,int i)
    {
        p = (agenda*) realloc(p,i*sizeof(agenda));
        if(p!= NULL)
        {
            //printf("\nRealocado com sucesso!");
            return 1;
        }
        else
        {
            //printf("\nN foi possivel realocar!");
            return 0;
        }
    }
    
    void cadastro(agenda*p, int *i)
    {
        if(!realocar(p, *i+1)){ // se não conseguir realocar
            printf("\nN foi possivel adicionar novo contato!");
            return;
        }
        //int resp;
        int j = *i;
    
        printf("Digite o nome: ");
        gets(p[j].nome);
        printf("Digite o email: ");
        gets(p[j].email);
        printf("Digite um telefone: ");
        gets(p[j].telefone);
        j++;
        *i = j;
        /*printf("\nCadastrar mais (s-1/n-0): ");
        scanf("%d",&resp);
        system("cls");
        while (resp == 1)
        {
            realocar(p,j);
            fflush(stdin);
            printf("\nDigite o nome: ");
            gets(p[j].nome);
            printf("Digite o email: ");
            gets(p[j].email);
            printf("Digite um telefone: ");
            gets(p[j].telefone);
            printf("\nCadastrar mais (s-1/n-0): ");
            scanf("%d",&resp);
        }//*/
    }
    
    void consultar(agenda *p, int i)
    {
        if(i == 0)
        {
            printf("\nSem registro!\n");
            return;
        }
    
        int k;
        for (k = 0; k < i; k++)
        {
            printf("\nID: %03d", k);
            printf("\nNome: %s",p[k].nome);
            printf("\nEmail: %s",p[k].email);
            printf("\nTelefone: %s\n",p[k].telefone);
        }
    }

    @Gustavo.A.Barroso talvez esse código já te ajude, dei uma alterada em umas partes, da pra melhorar mais, poderia acrescentar um ponteiro para o próximo contado da agenda dentro da struct e um ponteiro global pro ultimo elemento (isso se você já aprendeu a mexer com pilha/lista)

    Muito obrigado @Relry PeSan com certeza ajudou. Ainda tenho bastante dificuldade em trabalhar com ponteiros, pilha e fila ainda não aprendemos, será o próximo conteúdo. Aproveitando a oportunidade, você conhece algum livro ou apostila boa sobre o assunto? ponteiros, estruturas de dados etc??

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @Gustavo.A.Barroso Nunca fui muito fã de livros, sempre fui curioso e procurava coisas na internet video-aulas e tudo mais, mas uma vez comprei um livro na faculdade pra ajudar nos meus estudos "Treinamento em Linguagem C - Victorine Viviane Mizrahi", confesso que ele ajudou muito e ainda ajuda quando quero relembrar como faz determinada coisa, fala sobre as coisas mais básicas do programa em c até algumas coisas mais avançadas, também trata de ponteiros com códigos de exemplos intuitivos.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @Relry PeSan

    Esse é o famoso "verdinho" da Victorine?  talvez estou estudando da forma errada, sempre achei que deveria procurar por estruturas de dados  (lá não vi sobre pilha, fila, lista etc) porque de ponteiro pra trás tenho uma ideia boa, vou dar uma lida nesse e tentar sanar minhas dúvidas, qualquer coisa apareço aqui no fórum, obrigado pela sugestão.

     

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×