Ir ao conteúdo

Posts recomendados

Postado

Galera, estou com um problema que quando vou ler um valor na opção 1 na função main, ele entra em loop e fica lendo vários valores que eu digito, ao invés de continuar o código normalmente, alguém sabe dizer o que pode ser?

Nesse mesmo código, também estou tendo um problema ao ler a string na função novofunc, sempre dá o erro segmentation fault (core dumped).

Podem haver outros erros no código mas é porque ainda não revisei ele completamente, queria saber como resolver esses primeiro. Desde já agradeço.

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

typedef struct Funcionario{
	char nome[50];
	int idfunc;
	struct Funcionario *prox;
} func;

typedef struct Carro{
	int idcarro;
	struct Carro *prox;
} carro;

carro *head;
func *prim;

//criar pilha de carros
void criapilha(){
	head = malloc(sizeof(carro));
	head->prox = NULL;
}

//criar lista de funcionários
void crialista(){
	prim = malloc(sizeof(func));
	prim->prox = NULL;
}

//conta quantos funcionários estão cadastrados
int contafunc(){
	func *aux;
	int cont = 0;
	for(aux = prim; aux != NULL; aux++)
		cont++;
	return cont;
}

//conta quantos carros estão cadastrados
int contacarros(){
	carro *aux;
	int cont = 0;
	for (aux = head; aux != NULL; aux++)
		cont++;
	return cont;
}

//compara id dos funcionários
int comparafunc(int id){
	int i, num;
	func *p;
	p = prim;
	num = contafunc();
	for(i = 0; i < num; i++){
		if (id == p->idfunc)
			return 1;
		p = p->prox;
	}
	return 0;
}

//insere funcionário
void novofunc(){
	func *novo;
	novo = malloc(sizeof(func));
	char nome[50];
	int idf;
	int c = comparafunc(idf);
	printf("Digite o nome do funcionário\n");
	fgets(nome, 50, stdin);
	printf("Digite o id do funcionário\n");
	scanf("%d", &idf);
	if (c == 1)
		printf("Funcionário já cadastrado!\n");
	else{
		novo->idfunc = idf;
		novo->prox = prim->prox;
		prim->prox = novo;
	}
}

//remove funcionario
void removefunc(){
	func *p;
	p = prim->prox;
	prim->prox = p->prox;
	free(p);
}

//compara id dos carros
int compara(int id){
	int i, num;
	carro *p;
	p = head;
	num = contacarros();
	for(i = 0; i < num; i++){
		if (id == p->idcarro)
			return 1;
		p=p->prox;
	}
	return 0;
}

//insere carro
void push(int idc){
	carro *novo;
	novo = malloc(sizeof(carro));
	novo->idcarro = idc;
	novo->prox = head->prox;
	head->prox = novo;
}

//exibir carros estacionados
void exibecarros(){
	carro *p = head;
	if (p->prox == NULL)
		printf("Estacionamento vazio\n");
	else{
		printf("Os carros estacionados são:\n");
		while(p){
			printf("\nCarro %d", p->idcarro);
			p = p->prox;
		}
	}
}

//Exibe funcionários
void exibefunc(){
	func *p = prim;
	if (p->prox == NULL)
		printf("Nenhum funcionário cadastrado\n");
	else
		while(p){
			printf("\nNome: %s\nId: %d\n", p->nome, p->idfunc);
			p = p->prox;
		}
}

//remove carro
int pop(int id){
	int i, num, a;
	num = contacarros();
	carro *p;
	int c = compara(id);
	for(i = 0; i < num; i++){
		if (c == 1){
			p = head->prox;
			a = p->idcarro;
			head->prox = p->prox;
			free(p);
			return a;
		}
	}
	return 0;
}

int main(){
	int opcao, idc;
	criapilha();
	printf("Entre com a opção desejada:\n");
	printf("1. Adicionar carro\n");
	printf("2. Retirar carro\n");
	printf("3. Mostrar carros estacionados\n");
	printf("4. Cadastrar funcionário\n");
	printf("5. Remover funcionário\n");
	printf("6. Mostrar funcionários\n");
	scanf("%d", &opcao);

	switch(opcao){
		case 1:
			printf("Qual o id do carro que deseja estacionar?\n");
			scanf("%d", &idc);
			if (compara(idc) == 1)
				printf("ID já existe!");
			else{
				push(idc);
				printf("Carro estacionado!\n");
			}
			printf("Total de carros: ");
			contacarros();
		break;
		case 2:
			printf("Qual o id do carro que deseja retirar?\n");
			scanf("%d", &idc);
			pop(idc);
		break;
		case 3:
			exibecarros();
			printf("\n");
		break;
		case 4:
			novofunc();
			break;
		case 5:
			removefunc();
		break;
		case 6:
			exibefunc();
		break;
		default:
			printf("Opção inválida!");
	}
	return 0;
}

 

Postado

@Junior Conceição Encontrei os erros que você se deparou: muitas funções dentro do laço for você está fazendo aux++, mas acho que queria fazer aux = aux->prox; outro problema é que você esqueceu de chamar a função crialista no main; e o outro problema seria algo assim:

void novofunc()
{
    func *novo;
    novo = (func*)malloc(sizeof(func));
    char nome[50];
    int idf;
    int c;
    printf("Digite o nome do funcionário\n");
    fflush(stdin);
    fgets(nome, 50, stdin);
    printf("Digite o id do funcionário\n");
    scanf("%d", &idf);
    c = comparafunc(idf);
    if (c == 1)
        printf("Funcionário já cadastrado!\n");
    else
    {
        novo->idfunc = idf;
        novo->prox = prim->prox;
        prim->prox = novo;
    }
}

É compilável, mas eu não testei muito para saber se está certo e/ou faz o que você quer (meu compilador pede a conversão no malloc, mas é só tirar aí).

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!