Complete Program Source code : Implementation of Double Linked List
As I had told earlier that towards the end you shall see the complete program implementing the double linked list,here it is
#include <cstdlib> #include <iostream> #include<fstream> #include<conio.h> #include<process.h> #include <stdlib.h> using namespace std; typedef struct node { int data; // stores the node data node *next,*prev;// 2 ptrs(ptr vars),will have mem add,holding node type }NODE; // GLOBAL VARS NODE *first,*last;// Global ptrs,will have mem add,holding // node type long nodecount=0;//global var to keep count of nodes created // FUNCTION PROTOTYPES void addathead(NODE*); void addattail(NODE*); void deletenode(NODE*); void addafter(NODE*,NODE*); void addbefore(NODE*,NODE*); NODE* search(int); void deleteall(); void display(); int inputdata(); NODE* create();//create a blank node NODE* create(int);//create a populated node,with the int passed void deletelast(); void save(); void loadlist();//create a list as per the data in a file int main(int argc, char *argv[]) { first=last=NULL;// initing ptrs to NULL while(1) // infinite loop { system("cls"); char choice; cout<<"\n\n\t\t\tDOUBLE LINK LIST MENU"; cout<< "\n\t\t\t====================="; cout<< "\n\t\t\t1. Add a Record at Head"; cout<< "\n\t\t\t2. Add a Record at Tail"; cout<< "\n\t\t\t3. Add a Record by Search after a Node"; cout<< "\n\t\t\t4 Add a Record by Search before a Node"; cout<< "\n\t\t\t5. Get Record Count"; cout<< "\n\t\t\t6. Delete Selected Record"; cout<< "\n\t\t\t7. Display Records"; cout<< "\n\t\t\t8. Delete All records"; cout<< "\n\t\t\t9. Delete Last record"; cout<< "\n\t\t\ts. Save list to file"; cout<< "\n\t\t\tr. Load a list"; cout<< "\n\t\tPress Q to quit anytime"; cout<< "\n\t\tPlease Enter Choice (1 - 9)";choice=getche(); switch(choice) { case '1':NODE *temp; int num; num=inputdata(); temp=create(num); addathead(temp);temp=NULL;break; case '2': num=inputdata(); temp=create(num); addattail(temp);temp=NULL;break; case '3':NODE *newnode,*addnodeafter; num=inputdata(); newnode=create(num); cout<<"\n\n\t\tEnter data after which to add node :";cin>>num; addnodeafter=search(num); addafter(addnodeafter,newnode); newnode=addnodeafter=NULL; break; case '4': NODE *addnodebefore; num=inputdata(); newnode=create(num); cout<<"\n\n\t\tEnter data before which to add node :";cin>>num; addnodebefore=search(num); addbefore(addnodebefore,newnode); newnode=addnodebefore=NULL; break; case '5':cout<<"\n\n\t\tTotal "<<nodecount<<" Records,Press a key to continue ..."; getch();break; case '6':cout<<"\n\n\t\tEnter data for which to delete node :";cin>>num; temp=search(num); deletenode(temp);temp=NULL;break; case '7':display();break; case '8':deleteall();break; case '9':deletelast();break; case 's':save();break; case 'r':loadlist();break; case 'q':deleteall();exit(0);break; case 'Q':deleteall();exit(0);break; default : {cout<<"\n\n\t\tInvalid Choice ! Press a key to continue ..."; getch();} } } system("PAUSE"); return EXIT_SUCCESS; } //************************************************************************ NODE* create(int num) // function returns a pointer(add) of NODE type(add of new node) // null if node not created //function is passed the value with which node to be populated { NODE *temp; temp=new NODE; if(temp) // Mem allocated sucessfully,ie temp not NULL { temp->data=num; temp->next=NULL;//new node doesnt pt anywhere yet,till anothernode created temp->prev=NULL; return temp; } else { cout<<"\n\n\t\tOut of memory ! Press a key to continue ...";getch(); return NULL; } } NODE* create() // function returns a pointer(add) of NODE type(add of new node) // null if node not created,node data made=0 { NODE *temp; temp=new NODE; if(temp) // Mem allocated sucessfully,ie temp not NULL { temp->data=0; //no data passed ,by default init to zero temp->next=NULL;//new node doesnt pt anywhere yet,till anothernode created temp->prev=NULL; return temp; } else { cout<<"\n\n\t\tOut of memory ! Press a key to continue ... ";getch(); return NULL; } } int inputdata() //Function inputs data from user and returns that data { int num; cout<<"\n\n\n\t\tEnter the integer data to add to list : ";cin>>num; return num; } void addathead(NODE *temp)// this function is passed pointer(an add of type NODE) //and it links that node at the beg of list { if(temp)//add passed is not NULLL { if(first==NULL)//node being linked is the first node in the list { first=last=temp; } else { temp->next=first; first->prev=temp; first=temp; } nodecount++; cout<<"\n\n\t\tAdded data to list. Press a key to continue ...";getch(); }else { cout<<"\n\n\t\tOut of Memory error. Node could not be added ! Press a key to continue ...";getch(); } } void addattail(NODE *temp)// this function is passed pointer(an add of type NODE) //and it links that node at the end of list { if(temp)//add passed is not NULLL { if(first==NULL)//node being linked is the first node { first=last=temp; } else { temp->prev=last; last->next=temp; last=temp; } nodecount++; cout<<"\n\n\t\tAdded data to list. Press a key to continue ...";getch(); } else { cout<<"\n\n\t\tOut of Memory error. Node could not be added ! Press a key to continue ...";getch(); } } NODE* search(int searchdata)//returns pointer to (add of )node with givendata //returns NULL for no match/no node exists { NODE *temp=first; if(temp) //if first node exists { while(temp)// runs untill temp becomes NULL { if (temp->data==searchdata) { return temp; // return the add of node where match found } else { temp=temp->next;// go to next node } } cout<<"\n\n\t\t Data not Found ! Press a key to continue ... to continue...";getch(); return temp ; // will return NULL at the end of last node } else { cout<<"\n\n\t\tNo Node Exists ! Press a key to continue ...";getch(); return NULL; } } void addafter(NODE *nodetoaddafter,NODE *newnod) //function is passed a ptr to a NODE(add of),the node after which to add //node(nodetoaddafter),and the add of the node to be //added(newnod) { if(nodetoaddafter)// NULL is not passed as the node to add after { NODE *temp; temp=nodetoaddafter; if(nodetoaddafter!=last)//node after which to add is not the last node { newnod->prev=nodetoaddafter; newnod->next=nodetoaddafter->next; temp->next=newnod; } else { newnod->prev=nodetoaddafter; newnod->next=nodetoaddafter->next; temp->next=newnod; last=newnod; } nodecount++; cout<<"\n\n\t\tAdded data to list. Press a key to continue ...";getch(); } else { cout<<"\n\n\t\tOut of Memory error. Node could not be added ! Press a key to continue ...";getch(); } } void addbefore(NODE *nodetoaddbefore,NODE* newnode) { //fn is passed a ptr to a NODE(add of) //,the node before which to add //node(nodetoaddbefore),and the add of the node to be //added(newnode) if(nodetoaddbefore)// NULL is not passed as the node to add before { NODE *temp=nodetoaddbefore; if(nodetoaddbefore!=first)//node before which to add is not the first node { temp->prev->next=newnode; newnode->next=temp; newnode->prev=temp->prev; temp->prev=newnode; } else { temp->prev->next=newnode; newnode->next=temp; newnode->prev=temp->prev; temp->prev=newnode; first=newnode; } nodecount++; cout<<"\n\n\t\tAdded data to list. Press a key to continue ...";getch(); } else { cout<<"\n\n\t\tOut of Memory error. Node could not be added ! Press a key to continue ...";getch(); } } void deletenode(NODE *nodetobedeleted) //the add of node to be deleted is passed { if(nodetobedeleted)//add passed is not NULL { if(nodetobedeleted==first && nodetobedeleted==last)//only node { delete nodetobedeleted; first=last=NULL; } else if(nodetobedeleted==first) { NODE *temp=first; first=first->next; delete temp; first->prev=NULL; } else if(nodetobedeleted==last) { NODE *temp=last; last=last->prev;//last changes last->next=NULL; delete temp;temp=NULL; } else // none of above,node in between { nodetobedeleted->prev->next=nodetobedeleted->next; nodetobedeleted->next->prev=nodetobedeleted->prev; delete nodetobedeleted;nodetobedeleted=NULL; } nodecount--; cout<<"\n\n\t\tDeleted ! Press a key to continue ...";getch(); } else { cout<<"\n\t\tcould not delete,Press a key to continue ... !";getch(); } } void display() //displays all the nodes in the list { NODE *temp; temp=first; cout<<"\n\n\n"; while(temp) { cout<<endl<<"\t\t\t"<<temp->data; temp=temp->next; } cout<<"\n\n\t\t "<<nodecount<<" records displayed ,Press a key to continue .....";getch(); } void deleteall()//deletes all the nodes in the list,sets global ptrs to // to NULL { int count=nodecount; cout<<"\n\n\t\t"<<count<<" existing records will be deleted ! (y/n) " ;char choice=getch(); if((choice=='Y'|| choice=='y')) { NODE *temp; temp=first; while(temp) { first=first->next; delete temp;nodecount--; temp=first; } first=last=NULL; nodecount=0; cout<<"\n\n\t\t"<<count<<" records deleted. Press a key to continue ..." ;getch(); } } void deletelast() // deletes the last node { NODE *t=last; deletenode(t); } void save() // This saves the list in memory to a file joshi,bin in the //current directory of the executable.it is to be noted that //at the end of file NULL or 0 is stored,by default //this had created a bug while trying to read the file // see loadlist() { fstream listfile; listfile.open("list.dls",ios::out) ; NODE *temp; temp=first; while(temp!=NULL) { listfile.write((char*)temp,sizeof(int)); temp=temp->next; } listfile.close(); cout<<"\n\n\n\t\tLink list has been saved in file list.dls in current folder."; cout<<"\n\n\t\tPress a key to continue ... ";getch(); } void loadlist() { if(!(first==NULL)) //list not empty in memory { deleteall();//delete existing list in memory } fstream listfile; listfile.open("list.dls",ios::in) ; listfile.seekg(0);//set file ptr at the beg of file while(!listfile.eof()) { NODE *temp=create();//create a blank node if(temp) //memory allocation successful { listfile.read((char*)temp,sizeof(temp->data));// read the start data to temp // now,if the file was empty it still has null at the end // so 0 is read if (temp->data==NULL)// if file is empty or we are at end; { cout<<"\n\n\t\tFile is empty OR End of File reached ..."; cout<<"\n\n\t\t Press a key to continue ... !";getch(); delete temp;// no need to load a list now } else { //valid data read cout<<"\n\n\t\tdata read from file :"<<temp->data; addattail(temp); //addattail caters to the node being added to an empty list } } else { cout<<"\nUnable to load list,Out of memory ! Press a key to continue ...";getch(); } } listfile.close(); }
That is all.
If you liked this article please do leave a reply and share it with friends.
Thanks.