mourinho
mourinho

Reputation: 783

Correctly Implementing a Linked List in C

I am trying to implement a linked list from scratch in C:

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

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

void insert(struct node** root, int data){ 

    // Create a Node

    struct node * temp = malloc(sizeof(struct node));
    temp->data = data;
    temp->next = NULL;

    // Either root is NULL or not

    if (*root == NULL){
        *root = temp; // Directly modify the root
    }

    else {
        struct node * t = *root;
        while (t->next!=NULL){
            t = t->next;
        }
        t->next = temp; // Append at the last
    }
}

void printList(struct node * root){

    while(root!=NULL){
        printf("%d\t", root->data);
    }

}

struct node * search(struct node* root, int key){

    while (root!=NULL) {
        if (root->data == key) return root;
    }

    return NULL;
}

int main(){

    struct node * head = NULL;

    insert(&head,0);
    insert(&head,1);
    insert(&head,2);
    insert(&head,3);
    insert(&head,4);

    printList(head);

}

Now, when I run the program, my output is:

0       0       0       0       0       0       0       0       0       0

However, my list doesn't contain all zeroes or 10 elements.

My logic seems correct but somehow code has a bug.

On a side note, is there a way to avoid double pointers, can't I work with only pointers while inserting in a linked list?

Upvotes: 1

Views: 119

Answers (1)

Achal
Achal

Reputation: 11931

There is a small bug in the printList() function.

In printList() function, root not updated, to iterate whole list you should do root = root->next

void printList(struct node * root){

        while(root!=NULL){
                printf("%d\t", root->data);
                root = root->next; /* you miss this one */
        }

}

Same mistake is repeated in search() function also,

struct node * search(struct node* root, int key){
        while (root!=NULL) {
                if (root->data == key)
                        return root;
                else
                        root = root->next; /* if key not found root should be updated to next one */
        }
        return NULL;
}

Upvotes: 4

Related Questions