Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Minha função não é chamada corretamente!

Olá, estou com problemas para chamar a função. Insiro os dados pedidos, e quando o programa pergunta a ID para que eu possa imprimir os dados do usuário inserido, ele devolve, no entanto, apenas do segundo usuário! E ainda não imprime o número de engenheiros e engenheiros junior que foram inseridos e que as funções int Imprime_numero_ENG(TLISTA l) e Imprime_Lista_eng_salarios(l) (respectivamente), deveriam retornar na função main. Como devo proceder?

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

#define MAX 2
#define SUCESSO 2
#define FALTA_DE_MEMORIA 1
#define LISTA_VAZIA 3

typedef struct {
    char nome [50];
    int idade;
    float salario;
    char cargo [30];
    char cargo2 [30];
    int Id;
}TDADOS;

typedef struct nodo {TDADOS dado;
struct nodo *elo;
}TNODO;

typedef struct {TNODO *primeiro;
}TLISTA;

//=======protótipos===================//
void Cria_Lista(TLISTA *l);
int Inclui_Lista(TLISTA *l, TDADOS d);
int Conta_Elementos(TLISTA l);
void Imprime_Erro(int erro);
void Destroi_Lista(TLISTA *l);
int Imprime_Lista(TLISTA l);
int Imprime_numero_ENG(TLISTA l);
int Imprime_Lista_ID(TLISTA l, int Id);
int Imprime_Lista_eng_salarios(TLISTA l);


//===================================//
void Cria_Lista(TLISTA *l)
{
    l->primeiro = NULL;
}

int Inclui_Lista(TLISTA *l, TDADOS d)
{
    TNODO *p;
    p = (TNODO*)malloc(sizeof(TNODO));

    if (p==NULL)
    return(FALTA_DE_MEMORIA);
    else
    {
        if(l->primeiro == NULL)
        {
            l->primeiro = p;
            p->dado = d;
            p->elo = NULL;
        }
        else
        {
            p->dado = d;
            p->elo = l->primeiro;
            l->primeiro = p;
        }
        return(SUCESSO);
    }
}

int Conta_Elementos(TLISTA l)
{
    TNODO *p;
    int n = 0;
    if (l.primeiro == NULL)
        return(n);
    else
    {
        p = l.primeiro;
        while(p != NULL)
        {
            n++;
            p = p->elo;
        }
        return(n);
    }    
}

int Imprime_Lista(TLISTA l)
{
    TNODO *p;    
    if(l.primeiro == NULL)
    return(LISTA_VAZIA);

    else
    {    
        printf("Lista Encadeada: ");    
        p = l.primeiro;

        while(p != NULL)
        {
            printf("Nome: %s\n", p->dado.nome);
            printf("Idade: %d\n", p->dado.idade);
            printf("Salario: %.2f\n", p->dado.salario);
            printf("Cargo: %s %s\n", p->dado.cargo,p->dado.cargo2);
            printf("ID: %d\n", p->dado.Id);
            p = p->elo;
        }

    }
        //getchar();    
}


int Imprime_Lista_ID(TLISTA l, int Id)
{
    TNODO *p;    
    if(l.primeiro == NULL)
    return(LISTA_VAZIA);

    else
    {    
        //printf("Lista Encadeada: ");    
        p = l.primeiro;

        while(p != NULL)
        {
            if(p->dado.Id == Id){
            printf("Nome: %s\n", p->dado.nome);
            printf("Idade: %d\n", p->dado.idade);
            printf("Salario: %.2f\n", p->dado.salario);
            printf("Cargo: %s\n", p->dado.cargo,p->dado.cargo2);
            p = p->elo;
            }

        }

    }
        //getchar();    
}

int Imprime_Lista_eng_salarios(TLISTA l)
{

    int numero =0;
    int cont =0;
    char *str2 = "junior";
    char *str1 = "engenheiro";
    TNODO *p;    
    if(l.primeiro == NULL)
    return(LISTA_VAZIA);

    else
    {    


        p = l.primeiro;


        while(p != NULL)
        {

            if(p->dado.salario < 2500 && strncmp(str1, p->dado.cargo, 10) == 0 && strncmp(str2, p->dado.cargo2, 6) == 0){
            numero++;
            p = p->elo;
            }
            if(cont == 1000){
                p = NULL;
            }
        }

        printf("Numero de engenheiros Junior: %d\n",numero);

    }

        //getchar();    
}

int Imprime_numero_ENG(TLISTA l)
{
    int numero = 0;
    int cont = 0;
    char *str1 = "engenheiro";
    TNODO *p;    
    if(l.primeiro == NULL)
    return(LISTA_VAZIA);

    else
    {    

        p = l.primeiro;

        while(p != NULL)
        {
            cont++;
            if(strncmp(str1, p->dado.cargo, 10) == 0){
            numero++;
            p = p->elo;

            }
            if(cont == 1000){
                p = NULL;
            }


        }

        printf("Numero de engenheiros eh: %d\n", numero);

    }
        //getchar();    
}


void Destroi_Lista(TLISTA *l)
{
    TNODO *p;
    if(l->primeiro != NULL)
    {        
        p = l->primeiro;
        while(p != NULL)
        {
            l->primeiro = p->elo;                
            free(p);
            p = l->primeiro;
        }
    }    
}

void Imprime_Erro(int erro)
{
    switch(erro)
    {
        case FALTA_DE_MEMORIA: printf("ERRO: Falta de Memoria\n");
        break;
        case LISTA_VAZIA: printf("ERRO: Lista Vazia\n");
        break;
    }
    //getchar();
}


int main(){

TLISTA l;
TDADOS proximo_ponto; // é o "d" do exemplo
TNODO *p;
int n,erro,Id;
char resp;
int imprimeid;
char op1, op2, op3, op4;
char *str1 = "engenheiro";
p = l.primeiro;
Cria_Lista(&l);

for(int i=0; i<MAX; i++)
{
    printf("Digite seu nome: \n");
    scanf("%s", &proximo_ponto.nome);
    printf("Digite sua idade:\n");
    scanf("%d", &proximo_ponto.idade);
    printf("Digite seu salario:\n");
    scanf("%f", &proximo_ponto.salario);
    printf("Digite seu cargo:\n");
    scanf("%s", &proximo_ponto.cargo);
    if(strncmp(str1, proximo_ponto.cargo, 10) == 0){
    printf("Eh engenheiro Junior? s ou n?\n");
                scanf(" %c", &op3);
                if(op3 == 's'){
                    printf("Digite junior\n");
                    scanf("%s",&proximo_ponto.cargo2);

                }
            }
    printf("Digite a ID: \n");
    scanf("%d", &proximo_ponto.Id);

    Inclui_Lista(&l, proximo_ponto);

}
printf("Digite a ID do funcionario:\n");
scanf("%d", &imprimeid);
Imprime_Lista_ID(l,imprimeid);

printf("Deseja saber quantos funcionarios sao engenheiros s ou n?\n");
scanf(" %c", &op1);
if(op1 == 's'){
    Imprime_numero_ENG(l);
}
printf("Deseja saber quantos funcionarios sao engenheiros junior? s ou n?\n");
scanf(" %c", &op4);
if(op4 == 's'){
Imprime_Lista_eng_salarios(l);
}



//erro = Imprime_Lista(l);
//getchar();

return(0);

}
2 respostas

Oi Vinicius, tudo bem ?

Cara acho que a galera não conseguiu te ajudar muito bem nessa :(

Acho que vale a pena você abrir um novo tópico com o assunto da dúvida, acho que a galera pode te ajudar melhor.

solução!

Olá, Matheus! Acabei descobrindo qual era o erro: Dentro das minhas funções, a linha de código p = p->elo; estava dentro do loop, por isso não estava passando para próxima execução.