Search code examples
clinked-liststacksingly-linked-listfunction-definition

How to insert nodes into list by looping?


How to Implement in right way to store values into linked list? In this example the last element will be "0" . Is there a possible to write the content of while loop that allows me don't create the last node which will be "0" after allocating in while loop?

void store(Stack *a, t_important *data)
{
    int i;
    Stack *tmp;

    tmp = a;
    i = 0;
    while(i < data->length)
    {
        tmp->n = data->collection_of_ints[i];
        tmp->next = malloc(sizeof(Stack));
        tmp = tmp->next;
        i++;
    }
}

Input:

2->6->0->1->3->5->4

Output:

2->6->0->1->3->5->4->0

It is my main function in where i call the store function.

int main(int ac, char **av)
{
    Actions action;
    Stack *a;
    Stack *b;
    t_important *data;
    
    if(ac < 2)
        return (-1);
    data = malloc(sizeof(*data));
    stack_nums_counter(av, data);
    collect(av, data);
    __check__collection(data);
    __collecting_ints(data);
    action = init();
    a = NULL;
    b = NULL;
    store(&a, data);
    __sort_a__(&a, &b, data, action);
    return (0);
}

Solution

  • I would make store take a Stack** instead:

    void store(Stack **a, t_important *data) {
        // find last `next`
        while(*a) a = &(*a)->next;
    
        // insert values
        for(int i = 0; i < data->length; ++i)
        {
            *a = malloc(sizeof **a);
            (*a)->n = data->collection_of_ints[i];
            a = &(*a)->next;
        }
        *a = NULL; // terminate the linked list
    }
    

    and then call it like so

    Stack *my_stack = NULL;
    store(&my_stack, &some_t_important_instance);
    

    If you instead want to insert the important data first in the linked list, you skip the first while loop to find the last next member:

    void store(Stack **a, t_important *data) {
        Stack *old_first = *a;
        
        // insert values
        for(int i = 0; i < data->length; ++i)
        {
            *a = malloc(sizeof **a);
            (*a)->n = data->collection_of_ints[i];
            a = &(*a)->next;
        }
        
        // link the last inserted node to the old first node
        *a = old_first;
    }