Ir ao conteúdo
  • Cadastre-se

C Algoritmo e estrutura de dados


Posts recomendados

Boa noite,meu nome é Matheus,sou estudante do curso de Ciencia da Computação do 5°semestre,estou fazendo um trabalho em c junto com meu colega e estamos tendo dificuldade em solucionar esse erro da imagem,tentei alterar o switch tambem mas nao deu certo,solicito assistencia no erro por favor(Imagem em sequencia do erro abaixo)(Algoritmo embaixo do codigo).

image.png.f796b219273e45d5199fa522483bd64f.png&key=932d69d8514fc575image.png.fa6de347202fe6db43b715b2decb2bcf.pngimage.png.5f6b5029415f75dc8857d899184fb38d.png


 

//Aluno: Bruno Garcia Dos Santos Louveiro RA:202717013098
//Aluno: Matheus Tomi RA:203501813098
#include<stdio.h>
#include<stdlib.h>

struct Banco{	
	int numero_conta;
	char nome_cliente[30];
	float saldo;
	struct Banco *prox;
	struct Banco *ant;	
};typedef struct Banco node;

void inicia(node *inicio);
void InsereInicio(node *inicio);
void InsereFinal(node *inicio);
void exibe(node *inicio);
void remover(node *inicio);
void liberar(node * libera);
	
int main(){
	
	node *inicio = (node*) malloc(sizeof(node));
	inicia(inicio);	
	
	int opcao=1;
	
	while(opcao!=0){
		
	    system("cls");	
		printf("1-Exibir Lista \n");
		printf("2-Adicionar Novo Cliente \n");
		printf("3-Remover Cliente \n");
		printf("4-Zerar Lista \n");
		printf("Digite uma Opcao: ");
		scanf("%i",&opcao);
		system("cls");
		
		switch(opcao){
			
			case 1:
				
				exibe(inicio);
				break;
		
			int op;
			case 2:
				printf("\n");
				printf("1-Adicionar no Inicio \n");
				printf("2-Adicionar no Final \n\n");
				printf("Escolha Uma Das opções:\n");
				scanf("%i",&op);
				switch(op){
					case 1:
						InsereInicio(inicio);
						break;
					case 2:
						InsereFinal(inicio);
						break;
					default:
						printf("Opcao Invalida\n");
						system("PAUSE");
						break;
				}
			
			case 3:
				remover(inicio);
				break;
			case 4:
				inicio->prox=NULL;
				free(inicio);
				break;
			case 0:
				printf("Fim Da Execução!!!\n");
				break;
			default:
				system("cls");
				printf("Codigo Nao Encontrado\n");
				system("PAUSE");
				break;
				}
		}
		free(inicio);
		return 0;
}


void inicia(node* inicio){
	inicio->prox=NULL;
	inicio->ant =NULL;
}

//FUNÇÃO INSERE INICIO - PARA INSERIR NO INICIO DA LISTA
void InsereInicio(node* inicio){
	system("cls");
	
	node* novo =(node*) malloc(sizeof(node));
	
	if (!novo){
		printf("Nao foi possivel alocar a memoria!\n");
		exit(1);
	}
		printf("Informe o Nome do Cliente:");
		fflush(stdin);
		scanf("%c[^\n]",novo->nome_cliente);
		printf("Informe o Numero da Conta:");
		scanf("%i",novo->numero_conta);
		printf("Informe o Saldo do Cliente:");
		scanf("%d",novo->saldo);
	
	if(inicio->prox==NULL){	
		
		inicio->prox=novo;
		novo->prox=NULL;
		novo->ant=NULL;
		
	}else{
		
		node* aux = (node*) malloc(sizeof(node));
		
		aux=inicio->prox;
		
		novo->prox=inicio->prox;
		novo->ant=NULL;
		aux->ant=novo;
		
		inicio->prox = novo;
	}
}
//FUNÇÃO INSEREFINAL - PARA INSERIR NO FINAL DA LISTA
void InsereFinal(node* inicio){
	system("cls");

	node* novo = (node*) malloc(sizeof(node));
	
	if (!novo){
		printf("Nao foi possivel alocar a memoria!\n");
		exit(1);
	}
		printf("Informe o Nome do Cliente:");
		fflush(stdin);
		scanf("%c[^\n]",novo->nome_cliente);
		printf("Informe o Numero da Conta:");
		scanf("%i",novo->numero_conta);
		printf("Informe o Saldo do Cliente:");
		scanf("%d",novo->saldo);
	
	if(inicio->prox==NULL){
		
		novo->prox=NULL;
		novo->ant=NULL;
		
		inicio->prox=novo;
		
	}else{
		
		node* aux = (node*) malloc(sizeof(node));
		aux=inicio->prox;
		
		while(aux->prox!=NULL){
			aux=aux->prox;
		}
		
		novo->prox=NULL;
		novo->ant = aux;
		aux->prox=novo;
	}
	
}

//FUNÇÃO EXIBE - PARA EXIBIR TODAS AS CONTAS
void exibe(node* inicio){
	
	system("cls");
	
	node* aux =(node*)malloc(sizeof(node));
	aux=inicio;
	
	if(inicio->prox==NULL){
		printf("\nLista Vazia!\n");
		system("PAUSE");
	}else{
	
	while(aux->prox!=NULL){
		aux=aux->prox;

		printf("Cliente:%c\n Conta:%i\n Saldo:%f",aux->nome_cliente);
		printf("Conta: %i\n",aux->numero_conta);
		printf("Saldo: %f\n",aux->saldo);
		
	}
	
	system("pause");
}
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
void remover(node* inicio){
	
	node* aux =(node*) malloc(sizeof(node));
	aux=inicio;
	int conta;
	
	if(inicio->prox==NULL){
		printf("Nao ha Clientes a Serem Removidos!");
		exit(1);
	}
	
	printf("\nConta a Ser Removida: \n");
	scanf("%i",&conta);
	
	//procura o elemento na lista
	
	while(aux->numero_conta!=conta){
		aux=aux->prox;
	}
	
	//ponteiro para liberarar a memoria depois da operação
	node* libera =(node*) malloc(sizeof(node));
	
	//verifica se e o primeiro elemento da lista
	if(inicio->prox==aux){
		
		//verifica se é o unico elemento da lista. tive que que fazer isso por causa de um bug, nao sei se é necessario
		if(aux->prox==NULL){
			libera=aux;
		    inicio->prox = NULL;
		    liberar(libera);
		}else{
	    libera = aux;
		aux=aux->prox;
		aux->ant =NULL;
		inicio->prox = aux;
		liberar(libera);
        }
		
	}//verifica se o elemento e o ultimo da lista
	else if(aux->prox==NULL){
		libera = aux;
		aux=aux->ant;
		aux->prox = NULL;
		liberar(libera);
	}//se nao o elemento esta no meio
	else{
		node* temp = (node*) malloc(sizeof(node));
		
		libera = aux;
		temp = aux->ant;
		aux = aux->prox;
		temp->prox = aux;
		aux->ant=temp;
		liberar(libera);
	}
	
	printf("\nCliente Removido Com Sucesso!\n");
	system("pause");
}
void liberar(node* libera){
	free(libera);
}

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Matheus Morais tome disse:

node* aux =(node*)malloc(sizeof(node));
aux=inicio;

 

 

  • Reescreva assim que fica melhor, pois a memória de ponteiros (ponteiro é um tipo primitivo) já "vem de fabrica", atribuída durante sua declaração.
  1. node* aux= inicio;

 

1 hora atrás, Matheus Morais tome disse:

scanf("%c[^\n]",novo->nome_cliente);

  • Faça um teste isolado desse comando para averiguar se o resultado dentro da variável nome_cliente. é com esperado, pois eu acredito que não é.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

33 minutos atrás, AnsiC disse:
  • Reescreva assim que fica melhor, pois a memória de ponteiros (ponteiro é um tipo primitivo) já "vem de fabrica", atribuída durante sua declaração.
  1. 
    node* aux= inicio;

 

  • Faça um teste isolado desse comando para averiguar se o resultado dentro da variável nome_cliente. é com esperado, pois eu acredito que não é.

 

@AnsiC obrigado,fiz o teste,realmente era um erro nessa como tambem nas outras alterei os & pros corretos,funcionou,porém veio outro erro,o programa ainda esta fechando depois que tento cadastrar um cliente só,ele nao armazena na lista.(imagem do erro e a parte do codigo refeito ).

 

        image.png.0a1b60a2c1cb589b4f48d7481cc0694d.png

        printf("Informe o Nome do Cliente:");
        fflush(stdin);
        scanf("%s[^\n]",novo->nome_cliente);
        printf("Informe o Numero da Conta:");
        scanf("%d",novo->numero_conta);
        printf("Informe o Saldo do Cliente:");
        scanf("%f",novo->saldo);

 

 

Link para o comentário
Compartilhar em outros sites

8 horas atrás, Matheus Morais tome disse:

printf("Informe o Numero da Conta:");  scanf("%d",novo->numero_conta);
printf("Informe o Saldo do Cliente:"); scanf("%f",novo->saldo);

 

  • quando uma variável não é ponteiro e/ou vetor, devemos referenciar seu local inicial na memória colocando o operador & antes do seu nome (identificador).
  1. printf("Informe o Numero da Conta:");  scanf("%d", &novo->numero_conta);
    printf("Informe o Saldo do Cliente:"); scanf("%f", &novo->saldo);

     

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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