Ir ao conteúdo

Posts recomendados

Postado

Boa noite, solicito ajuda pois existe um erro de seguimento e não consigo enxergar onde errei,quem pude me ajudar por gentileza?

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

typedef struct ponto{
    int x;
    //char nome[]
    struct ponto *proximo;
}t_ponto;

void inserir(t_ponto *ini_ponto){
    int resp;

    t_ponto *proximo_ponto;

    if (ini_ponto == NULL)
    exit(1);

    printf("Digite x:");
    scanf("%d",&proximo_ponto->x);

    proximo_ponto -> proximo = (t_ponto*)malloc(sizeof(t_ponto));
    proximo_ponto = proximo_ponto->proximo;

    proximo_ponto->proximo = NULL;
    proximo_ponto = ini_ponto;
}
t_ponto *buscar(int valor, t_ponto *ini_ponto){
    
  t_ponto *proximo_ponto;
  proximo_ponto = ini_ponto;
    
  printf("Qaul valor deseja buscar na lista.\n");
  scanf("%d",&valor);

  while (proximo_ponto != NULL){
  if (proximo_ponto->x == valor){
    return proximo_ponto;
  }
  else{
    return NULL;
  }
  proximo_ponto = proximo_ponto->proximo; 
  }
}
t_ponto *remover(int valor, t_ponto *ini_ponto){

 t_ponto *proximo_ponto, *anterior;

 proximo_ponto = ini_ponto->proximo;
 anterior = ini_ponto;

 printf("Qual valor deseja remover?");
 scanf("%d",&valor);

 if (anterior->x == valor){
   ini_ponto = proximo_ponto;
   printf("Valor apagado pois se encontava no inicio da lista.\n");
   free(anterior);
 }
 while(proximo_ponto != NULL){
    if(proximo_ponto->x == valor){
     anterior->proximo = proximo_ponto->proximo;
     printf("Valor deletado.\n");
     free(proximo_ponto);
    }
   anterior = proximo_ponto;
   proximo_ponto = proximo_ponto->proximo;
  }
}
int main(){
    t_ponto *ini_ponto, *proximo_ponto, *resposta_funcao_busca;
 int valor, res;

 ini_ponto = (t_ponto *)malloc(sizeof(t_ponto));
 proximo_ponto = ini_ponto;
 
 do{
     printf("Digite 1 para inserir elementos a lista.\nDigite 2 para realizar busca de elementos.\nDigite 3 para realizar a remo??o de elementos na lista.\nDigite 4 para listar.\n");
     scanf("%d",&res);
     switch (res){
       case 1:{
         inserir(ini_ponto);
       break;
       }
       case 2:{
         resposta_funcao_busca = buscar(valor,ini_ponto);
         if (resposta_funcao_busca < 0){
         printf("%d\n",resposta_funcao_busca->x);    
         }
         else
           printf("Valor não encontrado.\n");
         
        break;
       }
       case 3:{
         remover(valor,ini_ponto);
        break;
       }
      }

 }while((res!=1)||(res!=2)||(res!=3));
    return 0;
}

 

 

 

 

 

Postado

Olá!

 

Parece ter vários problemas em seu programa. Isso compila em seu ambiente? Que sistema operacional e IDE/compilador você usa?

 

Não entendi por exemplo essa:

void inserir(t_ponto* ini_ponto);

Se com essa função pretende inserir algo na lista do tipo t_ponto como vai ser isso?


A maneira convencional de fazer isso seria

Lista*  inserir(void* elemento, Lista* lista);

Mas poderia ser algo como 

Lista* inserir( int elemento, Lista* lista );

No seu caso de usar apenas um int.

 

Tem gente que escreve 

Lista* inserir( int elemento, Lista** lista );

passando o endereço do ponteiro e  o elemento a inserir

 

De volta ao seu programa:

 

Do modo como declarou parece não ter nem um nem outro. Como passou só o  valor do ponteiro e não retornou nada  ele vai sumir lá dentro da função. E o elemento a inserir seria qual? Não leia valores dentro de uma rotina que trata sua estrutura de dados, a sua lista. Pense bem: só vai perder seu tempo. Só vai poder testar isso de modo interativo, por exemplo. Não use isso.

 

Postei hoje uma solução pra lista que funciona ok,  e um exemplo em C++ e outro em java nesse tópico. Veja lá o que expliquei e pode te ajudar. E tem um programa C com funções. Que funcionam. 

 

Sugiro muito ler esse post 

ou a discussão toda. Afinal é um programa de lista em C mesmo

De volta a seu código para  inserir()


    t_ponto *proximo_ponto;

    if (ini_ponto == NULL)
    exit(1);

    printf("Digite x:");
    scanf("%d",&proximo_ponto->x);

    proximo_ponto -> proximo = (t_ponto*)malloc(sizeof(t_ponto));
    proximo_ponto = proximo_ponto->proximo;

Seu compilador aceitou isso? Acabou de declarar proximo_ponto, um ponteiro. E espera atribuir algo a proximo_ponto->proximo? na linha seguinte? claro que vai dar erro. Não devia compilar na verdade.

 

Não acha confusa essa nomenclatura para suas variáveis? proximo_ponto = proximo_ponto->proximo; por exemplo?

 

buscar()

t_ponto* buscar(int valor, t_ponto* ini_ponto){};

Você declarou valor como parâmetro para depois tentar ler via scanf()? Sério? Vou dizer a mesma coisa de antes: tire isso daí. Passe o valor que quer buscar como parâmetro e retorne o endereço dele. Só isso.

 

remover()

 

Fez a mesma coisa que em buscar. Sugiro muito mudar. Sem scanf(). Sem printf()

 

main()

 

main(0 deve ser a primeira função de seu programa. Em especial se espera que outros venham a ler seu programa. Discuti isso em outro tópico aqui hoje. (Durante essas épocas de isolamento passei por muitos tópicos no forum :D) 

 

Não use menu em programas que ainda não estão funcionando. Nem leitura do teclado. Só vai atrasar tudo.

 

 

 

 

 

  • Curtir 1

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!