Ir ao conteúdo
  • Cadastre-se

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


gabreu2504

Posts recomendados

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 ..

Link para o comentário
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)

Link para o comentário
Compartilhar em outros sites

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??

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

@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.

 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...