Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tammys Rodrigues

função insere_ordenado - lista simples encadeada

Recommended Posts

To fazendo um trabalho da faculdade, mas não ta dando certo, complica mas não funciona, tenho que ordenar a lista por ordem crescente do salario dos funcionários. Alguém sabe me dizer o tem de errado na função Funcionario *insere(Funcionario *lista, Funcionario *novo) ?

 

Segue o código que fiz:

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

typedef struct Funcionario {
int codigo; 
char nome[35]; 
float salario; 
struct Funcionario *prox; 
} Funcionario;

Funcionario *cria(int codigo, char nome[35], float salario, Funcionario *lista){
    Funcionario *novo;
    Funcionario *temp = lista;
    novo = (Funcionario*) malloc(sizeof(Funcionario));
    novo->codigo = codigo;
    strcpy(novo->nome, nome);
    novo->salario = salario;
    
    while(lista!= NULL){
        if(novo->codigo == lista->codigo){
            printf("Codigo ja existente!\n");
            printf("Digite o codigo novamente: ");
            scanf("%d",&novo->codigo);
            lista = temp;
        }else{
            lista = lista->prox;
        }
    }
    
    novo->prox = NULL;
    printf("Funcionario cadastrado com sucesso!\n");
    system("pause");
    return novo;
}

Funcionario *insere(Funcionario *lista, Funcionario *novo){
        Funcionario * ant = NULL; // ponteiro para elemento anterior
        Funcionario * aux = lista; // ponteiro para percorrer a lista
        if (lista == NULL){
            float maior = lista->salario;
            return novo;     
        }else{
              float maior = lista->salario;
              while(lista != NULL && lista->salario > maior){ // procura posicao para inserção
                    ant = lista;
                    aux = aux->prox;
            } 
            novo = (Funcionario*) malloc(sizeof(Funcionario)); // cria novo elemento
            novo->salario = maior; 
            if(ant == NULL){ //encadea elemento
                   novo->prox = lista;
                   lista = novo;
            }else{// insere elemento na lista
                  novo->prox = ant->prox;
                  ant->prox = novo;
            }
            return lista;
        }
        
          
}


Funcionario *imprime(Funcionario *lista){
    if(lista == NULL){
               printf("Lista Vazia! Cadastre funcionarios.\n");   
      }
      while(lista != NULL){
               printf("\n-----------------------------\n");
               printf("Codigo: %d \n", lista->codigo);
               printf("Nome: %s \n", lista->nome);
               printf("Salario: %2.f\n", lista->salario);
               lista = lista->prox;
      }
      system("pause");
}

Funcionario *remove( Funcionario *lista, int codigo){
        Funcionario * aux = lista;
        Funcionario * remove = NULL;
        int cont = 1;
       
          if (lista == NULL) { 
                printf("Lista vazia!\n");
                return NULL;
          }
          
          if(aux->codigo == codigo){
                cont = 0;    
          }else{
              if (aux->prox->codigo == codigo){
                    cont++;
               }else{
                   if(lista != NULL){
                         while(aux->prox!= NULL && aux->prox->codigo != codigo){                                      
                                aux = aux->prox;
                                cont++;                        
                         }    
                        
                         if(aux->prox == NULL){                         
                                 return lista;
                         }
                   }
               }
          }
          
          if (cont == 0){ 
               if (aux->prox != NULL){
                  lista = aux->prox;  
               }else{
                  lista = NULL;    
                }
                free(aux);
          }else{     
                remove = aux->prox;
                aux->prox = remove->prox;
                free(remove);
                printf("Funcionario excluido com sucesso!\n");
                system("pause");
          }
          
          return lista;
}

float media (Funcionario *lista){
      float soma = 0, media;
      int cont = 0;
      
      while(lista != NULL){
                  soma += lista->salario;
                  lista = lista->prox;
                  cont++;
      }
      media = soma/cont;
      printf("Media = %2.f\n", media);
      system("pause");
}

Funcionario *maior_salario (Funcionario *lista){
      Funcionario *novo = lista;
      float maior = lista->salario;
      while(lista != NULL){
                  if(lista->salario > maior){
                                maior = lista->salario;
                                novo->codigo = lista->codigo;
                                strcpy(novo->nome,lista->nome);
                  }
      lista = lista->prox; 
      }
      printf("Codigo: %d\n", novo->codigo);
      printf("Nome: %s \n", novo->nome);
      printf("Salario: %2.f\n", maior);
      system("pause");
}

Funcionario *menor_salario (Funcionario *lista){
      Funcionario *novo = lista;
      float menor = lista->salario;
      while(lista != NULL){
                  if(lista->salario < menor){
                                menor = lista->salario;
                                novo->codigo = lista->codigo;
                                strcpy(novo->nome,lista->nome);
                  }
      lista = lista->prox; 
      }
      printf("Codigo: %d\n", novo->codigo);
      printf("Nome: %s \n", novo->nome);
      printf("Salario: %2.f\n", menor);
      system("pause");
}

main(){
    int menu, codigo;
    float salario;
    char nome[35];
    Funcionario *lista = NULL;
    Funcionario *dados = NULL;
    
    do{
        printf("Cadastro Funcionarios - Trabalho Grau A\n");
        printf("\n-----------------------------\n");
        printf("1 - Cadastrar Funcionario\n");
        printf("2 - Excluir Funcionario \n");
        printf("3 - Mostar Funcionarios cadastrados\n");
        printf("4 - Media de salario dos Funcionarios\n");
        printf("5 - Funcionario com maior salario\n");
        printf("6 - Funcionaro com menor salario\n");
        printf("0 - Sair \n");
        printf("\n-----------------------------\n");
        printf("Escolha uma opcao:");
        scanf("%d", &menu);
        
        switch(menu){
            case 1:
                system("cls");
                printf("Cadastrar Funcionario:\n");
                printf("\n-----------------------------\n");
                printf("Codigo:\n");
        		scanf("%d", &codigo);
        		printf("Nome: \n");
        		scanf("%s", &nome);
        		printf("Salario:\n");
        		scanf("%f", &salario);
        		dados = cria(codigo,nome, salario, lista);
        		lista = insere(lista, dados);
            break;
            
            case 2:
                system("cls");
                printf("Excluir Funcionario \n");
                printf("\n-----------------------------\n");
                imprime(lista);
                printf("Digite o codigo do funcionario:");
                scanf("%d", &codigo);
                lista = remove (lista, codigo);
            break;
            
            case 3:
                system("cls");
                printf("Mostar Funcionarios cadastrados\n");
                imprime(lista);
                
            break;
            
            case 4:
                system("cls");
                printf("Media de salario dos Funcionarios\n");
                printf("\n-----------------------------\n");
                media(lista);
            break;
            
            case 5:
                system("cls");
                printf("Funcionario com maior salario\n");
                printf("\n-----------------------------\n");
                maior_salario(lista);
            break;
            
            case 6:
                system("cls");
                printf("Funcionaro com menor salario\n");
                printf("\n-----------------------------\n");
                menor_salario(lista);
            break;
        
        }
        system("cls");   
    }while(menu !=0);
    
    system("pause");
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O seguinte trecho está errado:

 

  if (lista == NULL)
  {
    float maior = lista->salario;
    return novo;
  }

 

 

Se lista é NULL, logo, ela não possuirá o valor salário.

 

Remova a linha:

 

  if (lista == NULL)
  {
    return novo;
  }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa noite Tammys,

 

você conseguiu solucionar o problema?

 

se sim poderia postar o código por favor, estou com um problema bem parecido.

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.