Search code examples
c++doubly-linked-list

Why it is printing only 1st value of doubly linked list and than my program is crashing


I am trying to create a doubly linked list and then printing its value but the output is showing only first value and then the whole program is crashing.

I can't understand where is the problem in the code .

Input

3

1 2 3

Expected output

1 2 3

current output

1

#include<iostream>
#include<stdlib.h>
using namespace std;
class node                                  //declation of node
{
public:
    int data;
    node *next;
    node *prev;
};
node *makenode(node *head,int val)          //function to create node
{
    node *newnode=new node;
    node *temp;
    newnode->data=val;
    newnode->next=0;
    newnode->prev=0;
    if(head==0) temp=head=newnode;

    else
    {
        temp->next=newnode;
        newnode->prev=temp;
        temp=newnode;
    }
    return head;
}
void display(node *head)                     //display function
{
    system("cls");                          //clearing output screen
    while(head!=0)
    {
        cout<<head->data<<"  ";
        head=head->next;
    }
}
int main()
{
    node *head;
    head=0;
    int val;
    int s;                                   //size of list
    cout<<"ENTER THE SIZE OF LIST";
    cin>>s;
    system("cls");
    for(int i=0;i<s;i++)
    {
        cout<<"ENTER THE "<<i+1<<" VALUE\n";
        cin>>val;
        head=makenode(head,val);             //calling makenode and putting value
    }
    display(head);                           //printing value
    return 0;

}

Solution

  • You aren't actually linking anything together. This line: if(head==0) temp=head=newnode; is the only reason your linked list contains a value at all. The very first value sets head equal to it and when you print head you get that value. In order to properly do a linked list you need a head and tail pointer. The head points to the first element in the list and the tail points to the last. When you add an element to the end of the list you use tail to find the last element and link to it. It is easiest to make Linked List a class where you can encapsulate head and tail:

    struct Node {
    public:
        int data;
        node *next;
        node *prev;
        Node(int data) : data(data), next(nullptr), prev(nullptr) {} // constructor
    };
    
    class LinkedList {
    private:
        Node* head;
        Node* tail;
    
    public:
        LinkedList() { head = tail = nullptr; }
    
        // This function adds a node to the end of the linked list
        void add(int data) {
            Node* newNode = new Node(data);
            if (head == nullptr) { // the list is empty
                head = newNode;
                tail = newNode;
            }
            else { // the list is not empty
                tail->next = newNode; // point the last element to the new node
                newNode->prev = tail;  // point the new element to the prev
                tail = tail->next;  // point the tail to the new node
            }
        }
    };
    
    int main() {
    
      LinkedList lList;
      lList.add(1);
      lList.add(2);
      // etc...
    
      return 0;
    }