Ir ao conteúdo

Posts recomendados

Postado

criei uma função para inserir palavras em uma lista encadeada porém se essa palavra já estiver presente na lista aumenta o contador indicando quantas vezes essa palavra aparece o código faz bem a parte de inserir e enumerar a lista porém a busca não faz alguém poderia me ajudar resolver esse problema

 

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

typedef struct No {
    char chave[20];
    int num;
    struct No * Prox;
} No;

No * L = NULL;

void Enumere (No * L) {
    //Vai imprimir a lista.
    No * p = NULL;
    p = L;
    while (p != NULL){
        printf("%s\t repeticoes: %d\n", p->chave , p->num);
        p = p->Prox;
    }
};

void Insere(No** L, char nome[], int x){
    No * novo = NULL;
    novo = (No *) malloc(sizeof(No));
    strcpy(novo->chave, nome);
    novo->num = x;
    novo->Prox = *L; //insere um novo elemento na 1º posição da lista
    *L= novo;
};

/*void Busca (No* L, char nome[]){
    No * p = NULL;
    p = L;
    while ((p!=NULL)&& (strcmp(p->chave, nome)!= 0)){
        p = p->Prox;
    }
    if(p!=NULL){
        p->num = p->num+1;
    }
};*/
void Busca (No *L, char nome[]){
  No* p;
  p = L;
  if(p = NULL){
    Insere (&L, nome,1);//lista vazia então insere elemengo
  }else{
    while ((p!= NULL) && (strcmp(p->chave, nome)!= 0)){//varrer lista até fim ou até encontrar o elemento
      p = p->Prox;
    }
    if(p!=NULL){//p!= /null quer dizer que encontrou o elemento antes de chegar ao fim da lista
      p->num = p->num +1;//aumenta o contador numero de vezes que o elemento aparece
    }else{
      Insere(&L, nome,1);//não encontrou elemento então insere
    }
  }
};

int main(){
    No * L = NULL;
    char teste[]="cenoura";
    char teste2[]="suco";
    char teste3[]="computador";
    char teste4[]="suco";
    
    Insere(&L,teste,1);
    Insere(&L,teste2,1);
    Insere(&L,teste3,1);
    Busca(&L,teste4);
    Enumere(L);




	return 0;
}

 

 

Postado
Em 21/11/2019 às 18:36, Flávio Pedroza disse:

void Busca (No *L, char nome[]){
  No* p;
  p = L;
//if(p = NULL){
if(p == NULL){ //comparacao '==', atribuicao '='

 

verdade erro bobo porém mesmo assim ainda da erro se eu não chamar a função busca no main chamar apenas a função insere e enumera o programa roda

Postado
void Busca (No **L, char nome[]){
  No* p;
  p = *L;
  if(p == NULL){
    Insere (L, nome,1);//lista vazia então insere elemengo
  }else{
    while ((p!= NULL) && (strcmp(p->chave, nome)!= 0)){//varrer lista até fim ou até encontrar o elemento
      p = p->Prox;
    }
    if(p!=NULL){//p!= /null quer dizer que encontrou o elemento antes de chegar ao fim da lista
      p->num = p->num +1;//aumenta o contador numero de vezes que o elemento aparece
    }else{
      Insere(L, nome,1);//não encontrou elemento então insere
    }
  }
};

int main(){
    No * L = NULL;
    char teste[]="cenoura";
    char teste2[]="suco";
    char teste3[]="computador";
    char teste4[]="sardinha";
    
    Insere(&L,teste,1);
    Insere(&L,teste2,1);
    Insere(&L,teste3,1);
    Busca(&L,teste4);
    Enumere(L);


	return 0;
}

 

  • Curtir 1
Postado

Toda vez que quiser alterar o valor de um ponteiro dentro de uma função, você tem que passá-lo também por referência (ponteiro do ponteiro), como fez na função Insere. Em determinado ponto dentro da função "Busca" você chama a função "Insere", que alterar o valor da variável "No". Se você quiser que esta alteração persista, tem que usar ponteiro de um ponteiro. Veja esse código:

#include <stdio.h>

int y = 2;
int z = 3;


void altera_ponteiro (int **x)
{
    *x = &z;//agora sim, faz x aponta para z e tal alteracao permanece
}

void nao_altera_ponteiro (int *x)
{
    x = &z;//faz x aponta para z, mas a referencia nao permanece apos o fim da funcao
}

int main()
{
   
    int *x = &y; //x aponta para y
    
    printf ("%d\n", *x); //imprime 2, pois x esta refenciando y, que tem valor 2
    nao_altera_ponteiro (x); //tenta fazer x aponta para z, mas nao vai funcionar 
    printf ("%d\n", *x); //imprime 2, pois x ainda esta refenciando y, que tem valor 2
    altera_ponteiro (&x);
    printf ("%d\n", *x); //imprime 3, pois agora x esta refenciando z, que tem valor 3
    return 0;
}

 

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