Thursday, 17 September 2020

Doubly Linked List with All possible operations in C++

 #include<iostream>

using namespace std;

// fun prototype 

void create();

void display();

void displayrev();

void insert();

void insertAtBeg();

void insertAfterPos();

void insertAtPos();

void del();

void delAtBeg();

void delAtLast();

void delAtPos();

void search();

void rev();

struct node

{

 int data;

 node*next;

 node*prev;

};


struct node*head=NULL;

struct node*tail=NULL;

int lenOfList=0;



int main()

{

//main fun the program will start from here

  int choice;

 while(1)

 {

  cout<<"\n\n\n\t\t\t******MENU********";

  cout<<"\n1 Create firstnode or Append\n2 for display the list\n3 for inserting a node\n4 for deletion of a node\n";

  cout<<"5 for displaying in reverse\n6 for Reverse the list permenantly\n";

  cout<<"7 for length  \n8 for searching\n";

  cin>>choice;

  switch(choice)

  {

  case 1:create();

  break;

  case 2:display();

  break;

  case 3:insert();

  break;

  case 4:del();

  break;

  case 0:exit(1);

  break;

  case 5:displayrev();

  break;

  case 6:rev();

  break;

  case 7:cout<<lenOfList;

  break;

  case 8:search();

  break;

  default: cout<<" wrong  choice\n:";

  break;

  }

}


return 0;    // getch();

}



void create()

{

 // it will create 1st node

  int value;

  

  struct node *newnode;

  newnode=new node;


 cout<<"enter data to insert in node\n";

 cin>>value;

 newnode->data=value;

 newnode->next=NULL;

 newnode->prev=NULL;

 if (head == NULL)

 {

head=newnode;

tail = newnode;

  cout<<"1st node created successfully\n";

  lenOfList++;

 }

 else

 {

  tail->next = newnode;

  newnode->prev = tail;

  tail = newnode;

  cout<<"node created successfully\n";

  lenOfList++;

 }

 

}



void display()

{

struct node*temp2;

temp2=head;

if(head == NULL)

{

cout<<"empty list";

}

else

{

while(temp2!=NULL)

{

cout<<temp2->data<<"->";

temp2 = temp2->next;

}

cout<<"NULL";

}

}

void displayrev()

{

struct node*temp2;

temp2=tail;

if(head == NULL)

{

cout<<"empty list";

}

else

{

do

{

cout<<temp2->data<<"->";

if (temp2 == head)

break;

temp2 = temp2->prev;

}while(1);

cout<<"NULL";

}

}


void insert()

{

int choice;

  cout<<"\n\n\n\t\t\t******MENU********";

  cout<<"\n1 for insertion At Beg\n2 Insert on a specific Pos\n3 for Insert After the given Pos\n4 for insert at end\n";

  cin>>choice;

  switch(choice)

  {

  case 1:insertAtBeg();

  break;

  case 2:insertAtPos();

  break;

  case 3:insertAfterPos();

  break;

  case 4 :create();

  break;

  default: cout<<" wrong  choice for inserting\n:";

  break;

  }



}


void insertAtBeg()

{

struct node*newnode;

int val;

newnode = new node;

cout<<"enter data";

cin>>val;

newnode->data=val;

if(head==NULL)

{

cout<<"empty list\n";

head = newnode;

newnode->prev = NULL;

newnode->next = NULL;

}

else

{

head->prev = newnode;

newnode->next = head;

head = newnode;

}

cout<<"node created succesfully at beg";

lenOfList++;

}

void insertAtPos()

{

int pos;

cout<<"enter the posistion";

cin>>pos;

int i=1;

if(pos<1 || pos>lenOfList)

{

cout<<"invalid pos";

}

else if(pos==1)

{

insertAtBeg();

}

else if(pos==lenOfList)

{

create();

}

else

{

struct node*newnode,*temp2;

temp2 = head;

int val;

newnode = new node;

cout<<"enter data";

cin>>val;

newnode->data=val;

while(i<pos-1)

{

temp2 = temp2->next;

i++;

}

// main concept of insertion at pos

newnode->prev = temp2;

newnode->next = temp2->next;

temp2->next = newnode;

newnode->next->prev = newnode;

cout<<"node successfully added at"<<pos<<"\n";

lenOfList++;

}

}


void insertAfterPos()

{

int pos;

cout<<"enter the posistion";

cin>>pos;

int i=1;

if( (pos<1) || (pos>lenOfList))

{

cout<<"invalid pos";

}

else if(pos==lenOfList)

{

create();

}

else

{

struct node*newnode,*temp2;

temp2 = head;

int val;

newnode = new node;

cout<<"enter data";

cin>>val;

newnode->data=val;

while(i<pos)

{

temp2 = temp2->next;

i++;

}

// main concept of insertion at pos

newnode->prev = temp2;

newnode->next = temp2->next;

temp2->next = newnode;

newnode->next->prev = newnode;

cout<<"node successfully added at"<<pos+1<<"\n";

lenOfList++;

}

}


void del()

{

int choice;

  cout<<"\n\n\n\t\t\t******MENU********";

  cout<<"\n1 for deletion 1st node \n2 for deletion last node\n3 for deletion at a given pos\n";

  cin>>choice;

  switch(choice)

  {

  case 1:delAtBeg();

  break;

  case 2:delAtLast();

  break;

  case 3:delAtPos();

  break;

  default: cout<<" wrong  choice for inserting\n:";

  break;

  }



}

void delAtBeg()

{

struct node*temp;

temp = head;

if(head==NULL)

{

cout<<"empty list";

}

else if (head->next == NULL)

{

// only one node

head = NULL;

cout<<"empty list";

lenOfList=0;

}

else

{

head= head->next;

head->prev=NULL;

delete temp;

cout<<"deleted successully";

lenOfList--;

}

}

void delAtLast()

{

struct node*temp;

temp = tail;

if(head==NULL)

{

cout<<"empty list";

}

else if (head->next == NULL)

{

// only one node

head = NULL;

cout<<"empty list";

lenOfList=0;

}

else

{

tail= tail->prev;

tail->next=NULL;

delete temp;

cout<<"deleted successully";

lenOfList--;

}

}

void delAtPos()

{

int pos;

cout<<"enter position\n";

cin>>pos;

if (pos<1 || pos>lenOfList)

{

cout<<"invalid\n";

}

else if (pos == 1)

{

delAtBeg();

}

else if (pos == lenOfList)

{

delAtLast();

}

else

{

// main concept

struct node*temp;

temp=head;

int i=1;

while(i<pos)

{

temp=temp->next;

i++;

}

temp->prev->next = temp->next;

temp->next->prev = temp->prev;

delete temp;

cout<<"deleted successfully!!\n";

lenOfList--;

}

}

void search()

{

struct node*temp2;

temp2=head;

if(head == NULL)

{

cout<<"empty list";

}

else

{

int element;

int pos=0;

int flag=0;

cout<<"enter element to be searched\n";

cin>>element;

while(temp2!=NULL)

{

pos++;

if(temp2->data == element)

{

cout<<"element found at pos "<<pos<<"\n";

flag = 1;

break;

}

temp2 = temp2->next;

}

if (flag == 0)

{

cout<<"element not found\n";

}

}

}

void rev()

{

//just swap the pointers (head and tail) and (prev and next)

struct node*current , *nextnode;

if(head == NULL)

{

cout<<"empty";

}

else

{

cout<<"rev in progress\n";

current = head;

while(current!=NULL)

{

nextnode = current->next;

current->next = current->prev;

current->prev = nextnode;

current = nextnode;

}

// just swap the head and tail

current = head;

head = tail;

tail = current;

cout<<"rev complete\n";

display();

}

}


No comments:

Post a Comment