Ir ao conteúdo
  • Cadastre-se

C# alguém poderia ajudar com meu código de lista encadeada


88games16

Posts recomendados

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

 

 

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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