Ir ao conteúdo
  • Cadastre-se

C Lista encadeada simples em c


Posts recomendados

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;
}

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

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