Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Inserção e Busca em Lista


dbergkamps

Pergunta

Olá,

bom dia a todos!

Sou iniciante em C e estou com dificuldades para resolver o seguinte problema: tenho q criar uma lista encadeada onde armazene dois campos (produto e qtd). Mas, antes de incluir na lista, tenho q verificar se já não existe um produto com o nome a ser incluido(para não gerar duplicidade), se já existir, tenho q so atualizar a quantidade, somente se não existir tenho q incluir na lista. Depois de incluir, tenho q imprimir num arquivo texto, sendo q essa parte, acho q da pra resolver.

Se alguém puder ajudar, agradeço.

Att

Dalton

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0
Para verificar se o nome já foi incluído basta percorrer todos os elementos da lista e checar um a um. Qual a dúvida, mais especificamente?

Obrigado pela atenção Jonhatan, mas o problema é justamente este: codificar. você teria como me mandar um exemplo?

Att

Dalton

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite;

Sua estrutura da lista ficaria assim mais ou menos assim:

struct noLista {
    char produto[20];
    int quantidade;
    struct noLista *proximo;//Referência para o próximo item da lista
};
Para iniciar uma lista:
struct noLista *lista = NULL;//Você NÃO pode perder essa referência
//Então a condição de lista vazia é quando a variavel que aponta pra ela for NULL
Para adicionar um item no final da lista:
struct noLista *aux = lista;//Aponta aux para o inicio da lista
while( aux->proximo != NULL ){//O ultimo elemento não tem o valor "proximo" definido
    aux = aux->proximo;//Passa para o próximo item da lista
}

struct noLista *novoItem = (struct noLista*) malloc( sizeof( struct noLista ) );
strcpy( noLista->produto , "NOMEDOPRODUTO" );
novoItem ->quantidade = 10;
novoItem ->proximo = NULL;//Essa é a condição do final da lista

//Adiciona no final da lista
aux->proximo = novoItem;
Para consultar use o mesmo esquema do aux alí
int procura( char *item , truct noLista lista ){
    struct noLista *aux = lista;//Aponta aux para o inicio da lista
    while( aux->proximo != NULL ){
        if( strcmp( aux->proximo , item ) == 0 ){
            //PRODUTO ENCONTRADO
            return 1;
        }
        aux = aux->proximo;//Passa para o próximo item da lista
    }
    //PRODUTO NÃO ENCONTRADO
    return 0;
}

Btw, seria algo mais ou menos assim!

PS: NÃO testei o código

Qualquer dúvida dá um toque ae!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá,

Tentei compilar aqui e deu o seguinte erro na segunda linha desse código: incompatible types in initialization:

int procura( char *item , struct noLista lista ){
    struct noLista *aux = lista;//Aponta aux para o inicio da lista
    while( aux->proximo != NULL ){
        if( strcmp( aux->proximo , item ) == 0 ){
            //PRODUTO ENCONTRADO
            return 1;
        }
        aux = aux->proximo;//Passa para o próximo item da lista
    }
    //PRODUTO NÃO ENCONTRADO
    return 0;
}

A princípio seria tipos incompatíveis na inicialização, mas já procurei até no Google, mas não sei o q fazer para resolver. Se alguém puder ajudar, agradeço.

Att

Dalton

Link para o comentário
Compartilhar em outros sites

  • 0

Ahh, eu tinha falado que não tinha compilado o código! :(

O problema tá aqui oh:

int procura( char *item , struct noLista lista ){//....
E na atribuição do aux, ele espera um ponteiro para um struct noLista, portanto declare a função assim oh:
int procura( char *item , struct noLista *lista ){//....
Esse erro que deu era porque você (no caso eu) estava atribuindo uma variável que é um ponteiro para uma variável normal, vou dar um exemplo claro:
int *a;//PONTEIRO para inteiro
int b;//INTEIRO
int *c;

a = b;//Erro de tipo incompatíveis, o ponteiro espera receber um endereço de memória e não um valor inteiro.(foi o nosso caso)
a = &b;//Ok
a = c;//Tá ok, igualando 2 variáveis do mesmo tipo

No caso, eu declarei a função passando uma variável lista do tipo "struct noLista".

Depois dentro da função, eu faço aux(que é um PONTEIRO de "struct noLista") = lista(que é uma "struct noLista").

Enfim, se não deu pra entender dá um toque que eu tento explicar de outra maneira!

PS: Ainda NÃO compilei o código

Qualquer coisa, só postar aí! :)

Editado por p4t0X
Link para o comentário
Compartilhar em outros sites

  • 0

Olá,

Prezado Jonathan, ainda não consegui resolver o problema, mesmo com toda a dedicação da galera aqui do forum, em especial do p4t0x.

Ainda apresenta o seguinte erro na compilação:

passing arg 1 of 'strcmp' from incompatible pointer type.

O erro ocorre nesta linha:

if (strcmp(aux->proximo, item) == 0){

Se alguém puder ajudar, agradeço.

Att

Dalton

Link para o comentário
Compartilhar em outros sites

  • 0

Olá,

Consegui resolver o problema acima. O sistema compilou, mas não tenho certeza se tem (eu acho q tem) algum problema de lógica.

Segue o código, onde pousa minha dúvida:

struct noLista *lista = NULL;
             stLista* ptTempProduto = NULL;
             ptTempProduto = (stLista*)malloc(sizeof(stLista));
              if (procura("Produto", ptTempProduto = 0))
                 {
                            stLista *aux = lista;
                            while( aux->ptProxima != NULL )
                            {//O ultimo elemento não tem o valor "proximo" definido
                            aux = aux->ptProxima;//Passa para o próximo item da lista
                            }
                  strcpy(ptTempProduto->NomeProduto, "Produto");
                  ptTempProduto->qtd = 1;
                  ptTempProduto->ptProxima = NULL;//Essa é a condição do final da lista
                 //Adiciona no final da lista
                  aux->ptProxima = ptTemProduto;
                  }
              else
                  {
                            ptTempProduto->qtd = ptTempProduto->qtd + 1;
                  }

Será q existe algum erro na lógica?

Se alguém puder ajudar, agradeço.

Att

Dalton

Link para o comentário
Compartilhar em outros sites

  • 0

Ixi, essa função era para fazer o que?!

Não sei, mais aqui oh:

if (procura("Produto", ptTempProduto = 0))
Imagino que seria
if (procura("Produto", ptTempProduto ) == 0 ))
Não!? Btw, esse problema
if (strcmp(aux->proximo, item) == 0){

Era só trocar "aux->proximo" por "aux->produto"

Eu fiz todo o código de cabeça, por isso tem zilhões de erros :/

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...