Joe Kur
Joe Kur

Reputation: 47

Linked List not printing

I am trying to create a simple linked list using C, I think I was able to construct the linked list itself, but when I try and print it, it prints the value of the last node instead of all the values in the list.

#include <stdio.h>
#include <alloca.h>

typedef int DATA;
struct Node
{
    DATA d;
    struct Node *next;
};

void printList(struct Node **head)
{
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    struct Node *temp;
    temp = *head;
    while(temp!=NULL)
    {
       printf("%d \n", temp->d);
       temp = temp->next;
    }
}

int main()
{
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    struct Node *head = newNode;
    struct Node *temp = newNode;
    head->d = 1;
    int i = 0;
    printf("Enter 3 numbers");

    for( i = 0; i< 3; i++)
    {
        scanf("%d", &temp->d);
        temp->next = newNode;
        temp = temp->next;
    }

    temp->next = NULL;
    printf("%d \n", temp->d);

    return 0;
}

Any help/tips would be greatly appreciated.

Upvotes: 0

Views: 681

Answers (2)

Shubham Indrawat
Shubham Indrawat

Reputation: 74

Replace your code with the following code :-

#include<stdio.h>
#include <alloca.h>

typedef int DATA;

struct Node
{
    DATA d;
    struct Node *next;
};

void printList(struct Node **head)
{
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    struct Node *temp;
    temp = *head;
    while(temp->next!=NULL)
    {
       printf("%d \n", temp->d);
       temp = temp->next;
    }
}

int main()
{
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    struct Node *head = newNode;
    struct Node *temp = newNode;
    head->d = 1;
    int i = 0;
    printf("Enter 3 numbers");

    for( i = 0; i< 3; i++)
    {
        struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
        scanf("%d", &temp->d);
        temp->next = newNode;
        temp = temp->next;

    }

    printList(head);
    return 0;
}

Here you need to declare the newNode in the loop also while taking the input. As, the current value is over-writted, the old value is lossed and only the value of last node is printed.

Also while printing, check for temp->next!=Null instead of temp!=NULL

Upvotes: 1

Jay
Jay

Reputation: 24895

There are multiple problems in your code:

  • You are not creating the list properly. You are allocating memory for only one node and playing around with pointers improperly causing the linked list to be pointed to the same memory
  • You are not calling printList function at all
  • It is not clear why you are allocating memory again in printList whereas it should be printing the already created list
  • Also, no need to pass double pointer for printList as you are not modifying the list.

Though you should be understanding and doing the changes yourself, I am providing a below modified program which I hope will help you understand the mistakes in your code.

Please see the below modified version of the code

#include<stdio.h>
#include <alloca.h>

typedef int DATA;
struct Node
{
    DATA d;
    struct Node *next;
};


void printList(struct Node *head)
{
    struct Node *temp = head;

    while(temp!=NULL)
    {
        printf("%d \n", temp->d);
        temp = temp->next;
    }
}

struct Node *createNode()
{
    struct Node *newNode;

    newNode = malloc(sizeof(struct Node));
    if (NULL == newNode)
        return NULL;

    memset(newNode, 0, sizeof(struct Node));
    return newNode;
}

int main()
{
    struct Node *newNode = NULL;
    struct Node *headNode = NULL;
    struct Node *temp = NULL;
    int i = 0;
    int data = 0;

    printf("Enter 3 numbers\n");

    for( i = 0; i< 3; i++)
    {
        scanf("%d", &data);
        newNode = createNode();
        if (NULL == newNode)
            break;

        newNode->d = data;

        if (headNode == NULL)
        {
            headNode = newNode;
            temp = newNode;
        } 
        else
        {
            temp->next = newNode;
            temp = temp->next;
        }
    }
    printList(headNode);    
    return 0;
}

Upvotes: 1

Related Questions