Ir ao conteúdo
  • Cadastre-se

C Desenvolver lista estatica usando MALLOC


s4lezardv1A

Posts recomendados

Ola amigos. Estou com um problema para criar uma lista estatica. Preciso criar uma função criar_lista que reserve um espaço da memoria com o malloc e zere os atributos qtd da lista e idade de todos do meu vetor. Eu tinha feito o codigo sem o malloc, e estava rodando certo. Agora q decidi coloca-lo, estou tendo erro quando chamo a função inserir_final na opção 4 do menu. O programa fecha sem acusar erro, provavelmente estou passando parametro errado, mas n sei qual. A função criar lista não precisa ser necessariamente VOID, eu tinha feito antes de usar o malloc.... Onde estou errando?

 

#include <stdio.h>
#include <stdlib.h>
#define N 10// essa constante comanda o tamanho do meu vetor de pessoas do tipo pessoa
typedef struct  // uma struct que guarda dados como nome e idade de uma pessoa
{

    char nome[10];
    char idade[2];

} TIPO_PESSOA;

typedef struct // outra struct que guarda a quantidade de elementos e o tamanho da lista
{

    TIPO_PESSOA vetor[N];
    int qtd;

} TIPO_LISTA;


void criar_lista(TIPO_LISTA *list)
{
//list=malloc(sizeof(TIPO_LISTA));
//if(list != NULL){//se ainda tiver memoria
    list->qtd = 0;
// printf("\n\n\nLista criada com sucesso\n");
//}else{
//printf("\n\n\nLista nao foi criada\n");
//}


}
void inserir_final(TIPO_LISTA *list,TIPO_PESSOA ps) //aqui eu vou inserir uma ps(pessoa)
{
    fflush(stdin);
    list->vetor[list->qtd]=ps;//vou na minha lista e vou no vetor e uso o qtd para comandar ele e vai receber uma ps
    list->qtd=list->qtd+1;// aqui vou na minha qtd q esta na lista e adiciono o qtd+1
}


int menu()
{
    int op=0;

    printf("\n\n\t\t\t\t\t\t\tMenu principal\n\n\n");

    printf("1 - Criar Lista\n\n");
    printf("2 - Inserir no inicio\n\n");
    printf("3 - Inserir no meio\n\n");
    printf("4 - Inserir no final\n\n");
    printf("5 - Buscar por posicao\n\n");
    printf("6 - Listar os cadastros feitos\n\n");
    printf("8 - Sair\n\n\n");
    printf("Digite uma opcao: ");
    fflush(stdin);
    scanf("%d",&op);




    return op;
}

int main()
{
    system("mode con:cols=115 lines=40");
    TIPO_PESSOA pessoa;
    TIPO_LISTA lista;

    int op;
    do
    {
        op=menu();
        switch(op)
        {
        case 1:
            system("cls");
            criar_lista(&lista);

            break;
        case 2:

            break;
        case 3:

            break;
        case 4:
            system("cls");
            printf("\n\n\nDigite o nome: ");
            scanf("%s",pessoa.nome);//nome ja é um ponteiro entao n precisa de endereço para atribuir
            printf("Digite a idade: ");
            scanf(" %d",&pessoa.idade);// ponto porque é uma variavel normal
            inserir_final(&lista,pessoa);
            break;



        }
        system("pause");
        system("cls");

    }
    while(op!=8);


    system("pause");
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <stdlib.h>
#define N 10// essa constante comanda o tamanho do meu vetor de pessoas do tipo pessoa
typedef struct { // uma struct que guarda dados como nome e idade de uma pessoa

    char nome[100];
    int idade;
    
} TIPO_PESSOA;

int menu() {
    int op = 0;
    
    printf ( "\n\n\t\t\t\t\t\t\tMenu principal\n\n\n" );
    
    printf ( "1 - Criar Lista\n\n" );
    printf ( "2 - Inserir no inicio\n\n" );
    printf ( "3 - Inserir no meio\n\n" );
    printf ( "4 - Inserir no final\n\n" );
    printf ( "5 - Buscar por posicao\n\n" );
    printf ( "6 - Listar os cadastros feitos\n\n" );
    printf ( "8 - Sair\n\n\n" );
    printf ( "Digite uma opcao: " );
    fflush ( stdin );
    scanf ( "%d%*c", &op );
    
    
    
    
    return op;
}

void listar( TIPO_PESSOA *lista, int numeroDeCadastros ){
    int i;
    system ( "cls" );
    for (i=0; i<numeroDeCadastros ;i++ ) {
        printf("Nome: %s Idade: %d\n", lista[i].nome, lista[i].idade );
        
    }
    system("pause");
}

void createList( TIPO_PESSOA **ponteiroaPessoa, int tamanhoDesejadoLista){
    *ponteiroaPessoa = malloc(sizeof(TIPO_PESSOA)*tamanhoDesejadoLista);    
}

int main() {
    system ( "mode con:cols=115 lines=40" );
    TIPO_PESSOA *pessoa;
    int numeroDeCadastrados = 0;
    int op;
    
    do {
        op = menu();
        
        switch ( op ) {
            case 1:
                system ( "cls" );
                createList( &pessoa, N);
                
                break;
                
            case 2:
            
                break;
                
            case 3:
            
                break;
                
            case 4:
                if (numeroDeCadastrados < N ){
                    system ( "cls" );
                    printf ( "\n\n\nDigite o nome: " );
                    scanf ( "%[^\n]%*c", pessoa[numeroDeCadastrados].nome ); //nome ja é um ponteiro entao n precisa de endereço para atribuir
                    printf ( "Digite a idade: " );
                    scanf ( " %d%*c", &pessoa[numeroDeCadastrados].idade ); // ponto porque é uma variavel normal
                    numeroDeCadastrados++;
                }
                break;
            case 6:
                listar(pessoa, numeroDeCadastrados);
                break;
            default:    
                break;
        }
        
        
        system ( "cls" );
        
    } while ( op != 8 );
    
    
    free(pessoa);
    system ( "pause" );
    return 0;
}

Fiz isso meio que correndo da uma lida aí e o que não entender pergunte.

Link para o comentário
Compartilhar em outros sites

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