Insert an item in the chained list

Asked

Viewed 182 times

-1

I am trying to insert a new element a chained list without head, I can even insert more when leaving the function the pointer points to null again

void cadastrar_produto(char codProd[], char descricao[], char fornecedor[], char data_validade[], int qtd, double preco, produto *prod){

    produto *p = (produto *) malloc(sizeof(produto));

    strcpy(p->codigo,codProd);
    strcpy(p->descricao,descricao);
    strcpy(p->fornecedor,fornecedor);
    strcpy(p->data_validade,data_validade);
    p->qtd = qtd;
    p->preco = preco;
    p->prox = NULL;

    /* Inserindo o Produto na lista */

    if(prod == NULL){// ele cai dentro desse if sempre
        prod = p;
    }else{

        produto *lst;

        for(lst = prod;lst->prox != NULL; lst = lst->prox){

            puts("for");
            if(comparaString(lst->codigo, p->codigo) == 1){
                puts("Código já cadastrado !!!");
                break;
            }

            if(lst->prox != NULL){
                lst = lst->prox;
            }else{
                lst->prox = p;  
                break;      
            }       
        }
    }

    listar(prod);// ele lista o produto corretamente

    system("pause");
}

I don’t see why he doesn’t get on the list after he leaves office

1 answer

1

The point here is that you have a pointer on main that passes to the function in the hope that the function changes that pointer, with a simple assignment but that does not work as you imagine.

The simplified scenario is this (all ... mean the rest of the code):

void cadastrar_produto(..., produto *prod){
    if(prod == NULL){
        prod = p; // <-- instrução critica
    }
    ...
}

int main(){
    produto *lista = NULL;
    void cadastrar_produto(..., lista); 
    ...
}

The instruction prod = p changes the parameter prod which exists in the function and not the pointer lista that exists in the main and that is why it is always null. Remember that the parameters are passed by copy.

To be able to change the pointer you have to pass the pointer address, to go to the right place in memory and make the change:

Example (I have commented on all lines that need to be changed):

void cadastrar_produto(..., produto **prod){
//                                   ^--
    if(*prod == NULL){
//     ^--
        *prod = p;
//      ^--
    }
    else{
        produto *lst;
        for(lst = *prod;lst->prox != NULL; lst = lst->prox){
//                ^--
            ...
}

int main(){
    produto *lista = NULL;
    void cadastrar_produto(..., &lista); 
//                              ^--
    ...
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.