Ir ao conteúdo
  • Cadastre-se
88games16

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

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

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
void Busca (No *L, char nome[]){
  No* p;
  p = L;
//if(p = NULL){
if(p == NULL){ //comparacao '==', atribuicao '='

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Flávio Pedroza

Funcionou obrigado, porém porque usou na função Busca ponteiro para ponteiro para struct No ?

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

obrigado, dúvida sanada 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

Eletrônica

PROMOÇÃO DE QUARENTENA

Aproveite o isolamento social para aprender eletrônica!
De R$ 39,90 por apenas R$ 19,90
Só até as 23h59min desta sexta-feira 10/04/2020

CLIQUE AQUI E COMPRE AGORA MESMO!