Atreidex
Atreidex

Reputation: 408

Having a trouble with linked lists (adding and printing)

I'm too new on data structures, actually i began yesterday. Here is the code:

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int x;
    node *next;
};

void addToList(node *r, int a);
void printList(node *r);
int main()
{
    node *root;
    root = NULL;

    for (int i = 0; i < 5; i++)
    {
        int a;
        scanf("%d", &a);
        addToList(root, a);
    }

    printList(root);

    return 0;
}

void addToList(node *r, int a)
{
    while (r != NULL)
        r = r -> next;

    r = (node *)malloc(sizeof(node));
    r -> x = a;
    r -> next = NULL;
}

void printList(node *r)
{
    while (r != NULL)
    {
        printf("%d ", r -> x);
        r = r -> next;
    }

    printf("\n");
}

I expect the program gets new 5 elements into the list and then prints them. But end of the program nothing is happening. What is my fault?

Upvotes: 0

Views: 60

Answers (3)

Shubham Indrawat
Shubham Indrawat

Reputation: 74

Here, the first mistake is that you have not taken the *root pointer variable as global, so it will not update the value of the *root whenever a new node is inserted. It will keep the value of *root as NULL.

The below code has comments in it, which will explain the various mistakes done by you very easily.

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int x;
    node *next;
};
node *root;     //Declaring the *root as global

void addToList(int a);
void printList();
//removing the *root as parameter from both the functions

int main()
{
    root = NULL;
    for (int i = 0; i < 5; i++)
    {
    int a;
    scanf("%d", &a);
    addToList(a);
    }
    printList();
    return 0;
}

void addToList(int a)
{
    //Declaring a temporary pointer(*temp) to avoid the value loss of the *root pointer
    node *temp=root;

    //Declaring a new node to save the data taken from the user
    node *nn = (node *)malloc(sizeof(node));

    //Assigning the values to the new node(*nn)
    nn->x=a;
    nn->next=NULL;

    //Checking that the root node is NULL or not
    //If root is empty, then new node is assigned to *root
    if(root == NULL)
    {
        root=nn;
    }
    //Else, we will first find the last node of the linklist using the *temp pointer
    else
    {
        while (temp->next != NULL)
            temp = temp -> next;

        //Assigning the new node after the last node of the linklist
        temp->next=nn;
    }
}

void printList()
{
    node *r=root;
    while (r != NULL)
    {
        printf("%d ", r -> x);
        r = r -> next;
    }
    printf("\n");
}

Upvotes: 1

Mekicha
Mekicha

Reputation: 851

You have root = NULL but your addtoList function checks if root !=NULL. So the test fails there and nothing gets added. You should have something like this instead:

 void addToList(node *r, int a) {
        struct node *temp;
        temp=(struct node *)malloc(sizeof(struct node));
        temp->data = a;
        if (r== NULL) {
            r = temp;
            r->next = NULL;
        }
        else {
            temp->next = r;
            r = temp;
        }
}

Upvotes: 1

SHG
SHG

Reputation: 2616

The problem is in the addToList() function. If you want to update the root node of the list you have to define your function like that:

void addToList(node **r, int a)

Otherwise, you're sending the pointer to root and doing whatever you doing inside the function. But it doesn't affect root's value on main() and it remains NULL.

If you want to change the value of the pointer, you have to send from main() the address of the pointer to the function ==> addToList(&root, a);.

So now we can update where root points to. But it's not enough because you want root to always point to the beginning of the list ==> you want to update it only in the first call to addToList().

Last problem is to add the new created node as the last node in the list. You can do that by saving a temporary pointer to the last node. See my comments in the code (marked my changes with <<<):

void addToList(node **root, int a)                   <<<
{
    node *r = *root;                                 <<<
    node *last = NULL;                               <<<

    while (r != NULL) {
        last = r;                                    <<<
        r = r -> next;
    }

    r = (node *)malloc(sizeof(node));
    r -> x = a;
    r -> next = NULL;
    if (last == NULL) {                              <<<
        // this is true only on the first call to
        // addToList, so we update root only once
        *root = r;
    } else {
        // all other times we add the new node to be the last one
        last->next = r;
    }
}

Upvotes: 2

Related Questions