Ir ao conteúdo

Ajuda urgente - Lista encadeada.


arurearuro

Posts recomendados

Postado

Primeiramente, deixa eu me apresentar. Meu nome é Daniel, sou estudante de SI e esse é meu primeiro post.

Tenho o seguinte programa para criar:

Escreva um programa em linguagem C para o gerenciamento de uma lista de funcionários utilizando alocação dinâmica de memória, conforme a especificação abaixo.

Crie uma struct para descrever funcionarios. Os campos devem armazenar: Nome, Idade,Cargo, Salario e Endereço (usar outra struct com Rua, Numero,cep cidade e bairro)

Crie uma lista encadeada com esta struct e escreva um programa que apresente as seguintes possibilidades de manipulação da lista:

a) Inserir um funcionário no início da lista;

B) inserir um novo funcionário no final da lista;

c) Excluir um funcionário do início da lista;

d) Liste todos os funcionários na tela (todos os dados);

e) Liste os funcionários com determinado cargo (indicado pelo usuário);

f) Liste todos os funcionários de uma faixa de salario especifica (determinada pelo usuário);

g) excluir um funcionário do final da lista;

h) exibe o funcionário de maior e menor salario;

i) exclui um funcionário por nome – Lê uma nome , procura e exclui o funcionário da nome indicado.

Está tudo funcionando certinho, exceto com a função que exclui um funcionario por nome. Se alguém pudesse dar uma olhada na função e me ajudar a construi-la eu agradeceria.

Obrigado desde já.


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

//------------------------------ESTRUTURAS--------------------------------------

typedef struct ENDERECO //Estrutura que armazena os DADOS DE ENDEREÇO DO FUNCIONÁRIO.
{
char rua[50];
int numero;
int cep;
char cidade[50];
char bairro[50];
} End;

typedef struct DADOS_FUNCIONARIO //Estrutura que armazena NOME,IDADE e CARGO DO FUNCIONÁRIO.
{
char nome[50];
int idade;
float salario;
char cargo[50];
End Ende;
struct DADOS_FUNCIONARIO *proximo;
} DFunc; //<<<<<< TNODO

struct lista
{
DFunc *primeiro;
};

//------------------------------FIM-ESTRUTURAS----------------------------------


//--------------------INSERE FUNCIONARIO NO INICIO DA LISTA---------------------

void INSERE_FUNCIONARIO_INICIO (lista *l) // <<<<<<<<<insere_nodo
{
DFunc *noatual, *novono;

float salario;
int idade,numero,cep;
char nome[50],cargo[50],rua[50],cidade[50],bairro[50];

fflush(stdin);
printf("1-Digite o nome do funcionario: ");
gets(nome);
printf("\n2-Digite o cargo do funcionario: ");
gets(cargo);
printf("\n3-Digite o endereco: ");
printf("\n3.1-Rua: ");
gets(rua);
printf("\n3.2-Numero: ");
fflush(stdin);
scanf("%i",&numero);
fflush(stdin);
printf("\n3.3-Cidade: ");
gets(cidade);
printf("\n3.4-Bairro: ");
gets(bairro);
printf("\n3.5-CEP: ");
fflush(stdin);
scanf("%i",&cep);
printf("\n4-Digite a idade do funcionario: ");
fflush(stdin);
scanf("%i",&idade);
printf("\n5-Digite o salario do funcionario: ");
fflush(stdin);
scanf("%f",&salario);
if (l->primeiro == NULL)
{
novono = (DFunc *) malloc(sizeof(DFunc));

novono->salario = salario;
novono->Ende.numero = numero;
novono->Ende.cep = cep;
novono->idade = idade;
strcpy(novono->nome,nome);
strcpy(novono->cargo,cargo);
strcpy(novono->Ende.rua,rua);
strcpy(novono->Ende.cidade,cidade);
strcpy(novono->Ende.bairro,bairro);

novono->proximo = NULL;
l->primeiro = novono;
}
else
{
novono = (DFunc *) malloc(sizeof(DFunc));

novono->salario = salario;
novono->Ende.numero = numero;
novono->Ende.cep = cep;
novono->idade = idade;
strcpy(novono->nome,nome);
strcpy(novono->cargo,cargo);
strcpy(novono->Ende.rua,rua);
strcpy(novono->Ende.cidade,cidade);
strcpy(novono->Ende.bairro,bairro);

novono->proximo = l->primeiro;
l->primeiro = novono;
}
}

//------------------------------------------------------------------------------


//--------------------INSERE FUNCIONARIO NO FIM DA LISTA------------------------
void INSERE_FUNCIONARIO_FINAL (lista *l)
{
DFunc *noatual, *novono;

float salario;
int idade,numero,cep;
char nome[50],cargo[50],rua[50],cidade[50],bairro[50];

fflush(stdin);
printf("1-Digite o nome do funcionario: ");
gets(nome);
printf("\n2-Digite o cargo do funcionario: ");
gets(cargo);
printf("\n3-Digite o endereco: ");
printf("\n3.1-Rua: ");
gets(rua);
printf("\n3.2-Numero: ");
fflush(stdin);
scanf("%i",&numero);
fflush(stdin);
printf("\n3.3-Cidade: ");
gets(cidade);
printf("\n3.4-Bairro: ");
gets(bairro);
printf("\n3.5-CEP: ");
fflush(stdin);
scanf("%i",&cep);
printf("\n4-Digite a idade do funcionario: ");
fflush(stdin);
scanf("%i",&idade);
printf("\n5-Digite o salario do funcionario: ");
fflush(stdin);
scanf("%f",&salario);

if (l->primeiro == NULL)
{
novono = (DFunc *) malloc(sizeof(DFunc));

novono->salario = salario;
novono->Ende.numero = numero;
novono->Ende.cep = cep;
novono->idade = idade;
strcpy(novono->nome,nome);
strcpy(novono->cargo,cargo);
strcpy(novono->Ende.rua,rua);
strcpy(novono->Ende.cidade,cidade);
strcpy(novono->Ende.bairro,bairro);

novono->proximo = NULL;
l->primeiro = novono;
}
else
{
noatual = l->primeiro;
while(noatual->proximo != NULL)
noatual = noatual->proximo;
novono = (DFunc *) malloc(sizeof(DFunc));
novono->salario = salario;
novono->Ende.numero = numero;
novono->Ende.cep = cep;
novono->idade = idade;
strcpy(novono->nome,nome);
strcpy(novono->cargo,cargo);
strcpy(novono->Ende.rua,rua);
strcpy(novono->Ende.cidade,cidade);
strcpy(novono->Ende.bairro,bairro);
novono->proximo = NULL;
noatual->proximo = novono;
}
}
//------------------------------------------------------------------------------


//---------------------REMOVE FUNCIONARIO DO INÍCIO-----------------------------
void REMOVE_FUNCIONARIO_INICIO(lista *l)
{
DFunc *noatual, *nopro;
noatual=l->primeiro;
nopro=noatual->proximo;
free(noatual);
l->primeiro=nopro;
}
//------------------------------------------------------------------------------

//---------------------REMOVE FUNCIONARIO DO FINAL------------------------------

void REMOVE_FUNCIONARIO_FINAL(lista *l)
{
DFunc *noatual, *noant;
noatual=l->primeiro;
while(noatual->proximo != NULL){
noant = noatual;
noatual = noatual->proximo;
}

free(noatual);
noant->proximo=NULL;
}
//------------------------------------------------------------------------------


//----------------------LISTA TODOS OS FUNCIONARIOS-----------------------------

void LISTAR_FUNCIONARIOS (lista *l)
{
DFunc *noatual;
int i=0;
noatual = l->primeiro;
while( noatual != NULL){
i++;
printf("\n\n------> Funcionario %i\nNome: %s\nIdade: %i\nCargo: %s\nEndereço: %s, %i\n - Bairro %s - %s - CEP %i\nSalario: %.2f\n",i,noatual->nome , noatual->idade , noatual->cargo , noatual->Ende.rua,noatual->Ende.numero,noatual->Ende.bairro,noatual->Ende.cidade,noatual->Ende.cep,noatual->salario);
noatual = noatual->proximo;
}
printf("\n\n Ha %i elementos",i);
}
//------------------------------------------------------------------------------

//-------------------------LISTA POR CARGO--------------------------------------
void LISTAR_POR_CARGO (lista *l)
{
DFunc *noatual;
int i=0;
char cargodes[50];
noatual = l->primeiro;
printf("\n->Digite o cargo desejado:\n");
scanf(" %s",cargodes);
while( noatual != NULL){
if (strcmp(cargodes, noatual->cargo)==0){
i++;
printf("\n\n------> Funcionario %i\nNome: %s\nIdade: %i\nCargo: %s\nEndereço: %s, %i\n - Bairro %s - %s - CEP %i\nSalario: %.2f\n",i+1,noatual->nome,noatual->idade,noatual->cargo,noatual->Ende.rua,noatual->Ende.numero,noatual->Ende.bairro,noatual->Ende.cidade,noatual->Ende.cep,noatual->salario);
}
noatual = noatual->proximo;
}
printf("\n\n Ha %i elementos",i);
}
//------------------------------------------------------------------------------

//-----------------------LISTA POR FAIXA SALARIAL-------------------------------
void LISTAR_POR_FAIXA_SALARIAL (lista *l)
{
DFunc *noatual;
int i=0;
float sal1,sal2;
noatual = l->primeiro;
printf("\n->Salario entre: ");
scanf("%f",&sal1);
printf(" e ");
scanf("%f",&sal2);
while( noatual != NULL){
if ((noatual->salario>=sal1)&&(noatual->salario<=sal2)){
i++;
printf("\n\n------> Funcionario %i\nNome: %s\nIdade: %i\nCargo: %s\nEndereço: %s, %i\n - Bairro %s - %s - CEP %i\nSalario: %.2f\n",i+1,noatual->nome,noatual->idade,noatual->cargo,noatual->Ende.rua,noatual->Ende.numero,noatual->Ende.bairro,noatual->Ende.cidade,noatual->Ende.cep,noatual->salario);
}
noatual = noatual->proximo;
}
printf("\n\n Ha %i elementos",i);
}
//------------------------------------------------------------------------------

//------------------LISTA MAIOR E MENOR SALARIOS--------------------------------

void LISTAR_MAIOR_MENOR_SALARIOS (lista *l)
{
DFunc *noatual;
noatual = l->primeiro;
float mai=noatual->salario,men=noatual->salario;
while( noatual != NULL){
if(noatual->salario>mai){
mai=noatual->salario;
}
if(noatual->salario<men){
men=noatual->salario;
}
noatual = noatual->proximo;
}
printf("\n\nMaior salario: %.2f\nMenor salario: %.2f",mai,men);
}
//------------------------------------------------------------------------------

Eis a função que estou tendo problemas:


//------------------------EXCLUI POR NOME---------------------------------------
void REMOVE_FUNCIONARIO_NOME (lista *l)
{
DFunc *noatual,*nopro,*noant;
int controle=0;
char nome[50];

noatual = l->primeiro;
printf("\n->Digite o nome desejado:\n");
scanf(" %s",nome);
while(noatual != NULL){
if (strcmp(nome, noatual->nome)==0){
noant=noatual->proximo;
free(noatual);
}
else{
noatual = noatual->proximo;
}
}
}
//------------------------------------------------------------------------------


//-----------------------------MAIN---------------------------------------------
int main()
{
lista y;
DFunc *noatual;
y.primeiro = NULL;
int cod;
do{
printf(">>>>>>>>>>>>>>>>MENU<<<<<<<<<<<<<<<<<<<\n");
printf("1-Inserir um funcionario no inicio da lista.\n");
printf("2-Inserir um funcionario no final da lista.\n");
printf("3-Excluir um funcionário do inicio da lista.\n");
printf("4-Excluir um funcionário do final da lista.\n");
printf("5-Excluir um funcionario por nome.\n");
printf("6-Listar todos os funcionarios cadastrados.\n");
printf("7-Listar funcionarios por cargo.\n");
printf("8-Listar funcionarios por faixa salarial.\n");
printf("9-Listar maior e menor salarios.\n");
printf("10-Encerrar programa.\n");
printf("Escolha a opcao desejada: ");
scanf("%i",&cod);
switch(cod){
case 1:{
INSERE_FUNCIONARIO_INICIO(&y);
break;
}
case 2:{
INSERE_FUNCIONARIO_FINAL(&y);
break;
}
case 3:{
REMOVE_FUNCIONARIO_INICIO(&y);
break;
}
case 4:{
REMOVE_FUNCIONARIO_FINAL(&y);
break;
}
case 5:{
REMOVE_FUNCIONARIO_NOME(&y);
break;
}
case 6:{
LISTAR_FUNCIONARIOS(&y);
break;
}
case 7:{
LISTAR_POR_CARGO(&y);
break;
}
case 8:{
LISTAR_POR_FAIXA_SALARIAL(&y);
break;
}
case 9:{
LISTAR_MAIOR_MENOR_SALARIOS(&y);
break;
}
case 10:{
break;
}
default:printf("Opcao invalida.\n");
}
}while (cod != 10);

noatual = y.primeiro;
while (noatual != NULL)
{
y.primeiro = noatual->proximo;
free(noatual);
noatual = y.primeiro;
}
}

Postado

Daniel, bem-vindo. ;)

Não cheguei a testar exaustivamente, mas acho que está funcionando:

//------------------------EXCLUI POR NOME---------------------------------------
void REMOVE_FUNCIONARIO_NOME (lista *l)
{
DFunc *noatual,*nopro,*noant;
int controle=0;
char nome[50];

noatual = l->primeiro;

printf("\n->Digite o nome desejado:\n");

fflush(stdin);
gets(nome);

while(noatual != NULL)
{
if (strcmp(nome, noatual->nome) == 0)
{
if (noatual == l->primeiro)
{
l->primeiro = noatual->proximo;
free(noatual);
noatual = l->primeiro;
}
else
{
noant->proximo = noatual->proximo;
free(noatual);
noatual = noant;
}
}
else
{
noant = noatual;
noatual = noatual->proximo;
}

}

}
//------------------------------------------------------------------------------

[]'s

LNW

Postado
Daniel, bem-vindo. ;)

Não cheguei a testar exaustivamente, mas acho que está funcionando:

//------------------------EXCLUI POR NOME---------------------------------------
void REMOVE_FUNCIONARIO_NOME (lista *l)
{
DFunc *noatual,*nopro,*noant;
int controle=0;
char nome[50];

noatual = l->primeiro;

printf("\n->Digite o nome desejado:\n");

fflush(stdin);
gets(nome);

while(noatual != NULL)
{
if (strcmp(nome, noatual->nome) == 0)
{
if (noatual == l->primeiro)
{
l->primeiro = noatual->proximo;
free(noatual);
noatual = l->primeiro;
}
else
{
noant->proximo = noatual->proximo;
free(noatual);
noatual = noant;
}
}
else
{
noant = noatual;
noatual = noatual->proximo;
}

}

}
//------------------------------------------------------------------------------

[]'s

LNW

LNW, amigão, muito obrigado! Funcionou direitinho. Abraço!

Arquivado

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

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!