Search code examples
calgorithmdata-structureslinked-listscanf

Creating an entire doubly linked list in one function


I'm new to DSA and currently learning linked-list. I was trying to create an entire linked list in one function. The first scanf in createList function doesn't seem to assign the input to the address provided(i.e. &n). I tried printing n right after scanf. It doesn't print n to console at all. As a result, the output is not the way I expected. I can't figure out why.

//ENTIRE CODE HERE

#include<stdio.h>
#include<stdlib.h>
struct node {
    struct node* prev;
    int data;
    struct node* next;
};

void print_nodes(struct node* );
struct node* addToEmpty(struct node*, int);
struct node* addAtEnd(struct node*, int);
struct node* createList(struct node*);

int main() {
    struct node* head = NULL;
    head = createList(head);
    print_nodes(head);
}

void print_nodes(struct node* head) {
    struct node* ptr = head;
    while (ptr != NULL) {
        printf("%d ", ptr->data);
        ptr = ptr->next;
    }
    printf("\n");
}

struct node* addToEmpty(struct node* head, int data) {
    struct node* temp = malloc(sizeof(struct node));
    temp->prev = NULL;
    temp->data = data;
    temp->next = NULL;
    head = temp;
    return head;
}

struct node* addAtEnd(struct node* head, int data) {
    struct node* tp = head;
    struct node* temp = malloc(sizeof(struct node));
    temp->prev = NULL;
    temp->data = data;
    temp->next = NULL;
    while (tp->next != NULL) {
        tp = tp->next;
    }
    tp->next = temp;
    temp->prev = tp;
    return head;
}

struct node* createList(struct node* head) {
    int n, data, i;
    printf("Enter the number of nodes: ");
    scanf("%d ", &n);

    if (n == 0)
        return head;

    printf("Enter the element of node 1: ");
    scanf("%d ", &data);
    head = addToEmpty(head, data);

    for (i = 1; i < n; i++) {
        printf("Enter the element of node %d: ", i + 1);
        scanf("%d", &data);
        head = addAtEnd(head, data);
    }
    return head;
}

Solution

  • your problem is so simple , instead of scanf("%d ", &n); , just write scanf("%d", &n); by which I mean to remove the wite space after %d as it's producing some strange behavior in your case , as if you refer to scanf() manual page , they say that :

    A sequence of white-space characters (space, tab, newline, etc.; see isspace(3)). This directive matches any amount of white space, including none, in the input.

    which is supposed to ignore any whitespace after the number entered till getting a valid char.

    and here is the full code but with this only small modification:

        #include<stdio.h>
    #include<stdlib.h>
    struct node {
        struct node* prev;
        int data;
        struct node* next;
    };
    
    void print_nodes(struct node* );
    struct node* addToEmpty(struct node*, int);
    struct node* addAtEnd(struct node*, int);
    struct node* createList(struct node*);
    
    int main() {
        struct node* head = NULL;
        head = createList(head);
        print_nodes(head);
    }
    
    void print_nodes(struct node* head) {
        struct node* ptr = head;
        while (ptr != NULL) {
            printf("%d ", ptr->data);
            ptr = ptr->next;
        }
        printf("\n");
    }
    
    struct node* addToEmpty(struct node* head, int data) {
        struct node* temp = malloc(sizeof(struct node));
        temp->prev = NULL;
        temp->data = data;
        temp->next = NULL;
        head = temp;
        return head;
    }
    
    struct node* addAtEnd(struct node* head, int data) {
        struct node* tp = head;
        struct node* temp = malloc(sizeof(struct node));
        temp->prev = NULL;
        temp->data = data;
        temp->next = NULL;
        while (tp->next != NULL) {
            tp = tp->next;
        }
        tp->next = temp;
        temp->prev = tp;
        return head;
    }
    
    struct node* createList(struct node* head) {
        int n, data, i;
        printf("Enter the number of nodes: ");
        scanf("%d", &n);
    
        if (n == 0)
            return head;
    
        printf("Enter the element of node 1: ");
        scanf("%d", &data);
        head = addToEmpty(head, data);
    
        for (i = 1; i < n; i++) {
            printf("Enter the element of node %d: ", i + 1);
            scanf("%d", &data);
            head = addAtEnd(head, data);
        }
        return head;
    }
    

    and this is the output:

     Enter the number of nodes:3
     Enter the element of node 1:1
     Enter the element of node 2:2
     Enter the element of node 3:3
     1 2 3