Ali
Ali

Reputation: 138

Adding a node at the beginning of a Singly Linked List (C)

The code works without error but I cant seem to know why the new node is not being inserted to the beginning of the list. It probably has something to do with the else statement in the first function (insertNode) but I'm not sure, what's going on?

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

struct node {
    int data;
    struct node *link;
};

void insertNode(struct node *head, int x) {
    //Create node to be added and add the input integer to it
    struct node *temp;
    temp = (struct node *)malloc(sizeof(struct node));
    temp->data = x;

    //Check if there are any existing nodes in the list, if not, the let the head be equal to the new temp pointer
    if (head == NULL) {
        head = temp;
    } else {
        //If not, then we need to add the node to the beginning
        temp->link = head;
        head = temp;        
        printf("Node was added successfully!\n");
    }
}

int findsize(struct node *head) {
    //Finds the size of the list

    struct node *temp = head;
    int count = 0;
    while (temp != NULL) {
        count++;
        temp = temp->link;
    }
    return count;
}

void printData(struct node *head) {
    //Prints the elements of the list
    struct node *temp = head;
    while (temp != NULL) {
        printf("Element: %d\n", temp->data);
        temp = temp->link;
    }
}

void main() {
    //Created a node and allocated memory
    struct node *head;
    head = (struct node *)malloc(sizeof(struct node));
    //Added data to the node and created another one linked to it
    head->data = 15;
    head->link = (struct node *)malloc(sizeof(struct node));
    head->link->data = 30;
    head->link->link = NULL;
    //Used the above function to add a new node at the beginning of the list
    insertNode(head, 5);
    //Print the size of the list    
    printf("The size of the list you gave is: %d\n", findsize(head));
    //Print the elements of the list
    printData(head);
}

Upvotes: 3

Views: 557

Answers (1)

chqrlie
chqrlie

Reputation: 144695

When you insert a node at the beginning of the list, you effectively change the beginning of the list, so this new initial node must be returned to the caller. The prototype for insertNode() must be changed to return the list head or to take a pointer to the list head.

Here is a modified version with the first approach:

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

struct node {
    int data;
    struct node *link;
};

struct node *insertNode(struct node *head, int x) {
    //Create node to be added and add the input integer to it
    struct node *temp;
    temp = (struct node *)malloc(sizeof(struct node));
    if (temp != NULL) {
        temp->data = x;
        temp->link = head;
    }
    return temp;
}

int findsize(struct node *head) {
    //Find the size of the list
    struct node *temp = head;
    int count = 0;
    while (temp != NULL) {
        count++;
        temp = temp->link;
    }
    return count;
}

void printData(struct node *head) {
    //Prints the elements of the list
    struct node *temp = head;
    while (temp != NULL) {
        printf("Element: %d\n", temp->data);
        temp = temp->link;
    }
}

void main() {
    //Created a node and allocated memory
    struct node *head = NULL;
    //Insert 3 nodes with values 30, 15 and 5
    head = insertNode(head, 30);
    head = insertNode(head, 15);
    head = insertNode(head, 5);
    //Print the size of the list    
    printf("The size of the list you gave is: %d\n", findsize(head));
    //Print the elements of the list
    printData(head);
    //Should free the nodes
    return 0;
}

Upvotes: 3

Related Questions