I'm having segmentation fault problem with this structure. I try to use strcpy
to copy the char value to the list struct but not worked.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct Elemento_FILA{
// int cod_cliente, consumo, dia_venc, mes_venc, ano_venc;
// float preco_un,valor_total;
char nome_cliente[40];
struct Elemento_FILA *proximo;
} Elemento_Fila;
typedef struct Fila{
struct Elemento_FILA *inicio;
struct Elemento_FILA *fim;
} Fila;
int escolha;
Fila* Criar_Fila(){
Fila *f = (Fila*) malloc(sizeof(Fila));
if(!f)
exit(1);
else {
f->inicio = NULL;
f->fim = NULL;
}
return f;
}
int Fila_Vazia(Fila *f){
if(f==NULL) return 1;
if(f->inicio==NULL) return 1;
else return 0;
}
int Ler_Cod(){
int cod;
printf (" Digite o código para o cliente: ");
scanf("%i",&cod);
return cod;
}
char* Ler_Nome() {
char* nome_cliente = malloc(40*sizeof(char));
printf(" Digite o nome do cliente: ");
scanf("%s", &nome_cliente);
return nome_cliente;
}
int Ler_Consumo(){
int consumo;
printf (" Digite o consumo para o cliente: ");
scanf("%i",&consumo);
return consumo;
}
Elemento_Fila* Alocar(const char* nome){
Elemento_Fila *no_fila = (Elemento_Fila*)malloc(sizeof(Elemento_Fila));
if(!no_fila)
exit(1);
else{
strcpy(no_fila->nome_cliente,nome);
return no_fila;
}
}
void Enfileirar(Fila *f){
Elemento_Fila *no_fila = Alocar(Ler_Nome());
if(!no_fila)
exit(1);
if(f->fim == NULL)
f->inicio = no_fila;
else
f->fim->proximo = no_fila;
f->fim = no_fila;
}
int Desenfileirar(Fila *f){
if(Fila_Vazia(f)) return 0;
Elemento_Fila *no_fila = f->inicio;
f->inicio = f->inicio->proximo;
if(f->inicio==NULL)
f->fim = NULL;
free(no_fila);
return 1;
}
void Exibir_Fila(Fila *f){
if(Fila_Vazia(f)){
printf (" Fila Vazia!\n");
printf ("\n Fila End. Inicio %p: ", f->inicio);
printf ("\n Fila End. Fim %p: ", f->fim);
return ;
}
Elemento_Fila *aux = f->inicio;
printf ("\n Fila Atual: ");
printf ("\n Fila End. Inicio %p: ", f->inicio);
printf ("\n Fila End. Fim %p: ", f->fim);
printf ("\n");
while(aux!=NULL){
printf ("\n\t Nome: %s \tEndereco: %p ==> %p", aux->nome_cliente, aux, aux->proximo);
aux = aux->proximo;
}
printf ("\n");
}
void opcoes(int escolha, Fila *f){
switch(escolha){
case 1:
Enfileirar(f);
Exibir_Fila(f);
break;
case 2:
Desenfileirar(f);
Exibir_Fila(f);
break;
default:
if (escolha!=0) printf (" Opção Inválida!\n");
}
}
int menu(){
printf ("\n Opções da Fila;\n");
printf (" 0 Sair;\n");
printf (" 1 Inserir na Fila;\n");
printf (" 2 Retirar da Fila;\n");
printf (" Escolha: ");
scanf("%i", &escolha);
return escolha;
}
int main (void){
Fila *f = Criar_Fila();
do{
escolha = menu();
opcoes(escolha,f);
}while(escolha);
return 0;
}