This blog will contain simple solved solution for general C++ problems such as data structures, algorithms etc..

C++ Generic Linked List implementation with template

| Saturday, February 27, 2010

This is a C++ code which is implementing generic Linked list using the template concept.
This will be solution for your data structure implementation like queue and stack...

The code gives an example of stack implementation also.


The program is tested on Visual studio 2005 and g++(using msys and MinGW).
It is tested for memory related issues also....

working screen shot for the stack implementation ..






//-----------genericLinkedList.h starts here-----------------//

#ifndef _GENERICLINKEDLIST_HPP
#define _GENERICLINKEDLIST_HPP

#include

using namespace std;

#define NEW(varname, classname) \
do \
{ \
try \
{ \
varname = new classname; \
} \
catch(...) \
{ \
varname = NULL; \
} \
}while(0)


enum TBool
{
False = 0,
True = 1
};

namespace LIST
{
template
class LinkedList
{
class Node
{
public:
T data;
Node *next;

public:
Node(T __data) : data(__data)
{
next = NULL;
}
Node()
{
next = NULL;
}
};
Node * start;
Node * end;
public:
LinkedList();
~LinkedList();
TBool insertAtStart(const T & data);
TBool insertAtEnd(const T & data);
TBool removeFromStart(T & data);
TBool removeFromEnd(T & data);
TBool getDataFromStart(T & data);
TBool getDataFromEnd(T & data);
void print();
void makeNodeEmpty();
};

template
LinkedList::LinkedList()
{
start = end = NULL;
}

template
LinkedList::~LinkedList()
{
makeNodeEmpty();
}

template
TBool LinkedList::insertAtStart(const T & data)
{
cout<<"Enter LinkedList::insertAtEnd\n";

Node * temp = NULL;
NEW(temp, Node(data));
if (NULL == temp)
{
cout<<"memory allocation failure\n";
return False;
}

if ((start == NULL) && (end == NULL))
{
//This is the first time something is added
//to this list
start = end = temp;
}
else
{
temp->next = start;
start = temp;
}

return True;
};

template
TBool LinkedList::insertAtEnd(const T & data)
{
cout<<"Enter LinkedList::insertAtEnd\n";

Node * temp = NULL;
NEW(temp, Node(data));
if (NULL == temp)
{
cout<<"memory allocation failure\n";
return False;
}

if ((start == NULL) && (end == NULL))
{
//This is the first time something is added
//to this list
start = end = temp;
}
else
{
end->next = temp;
end = temp;
}

return True;
};

template
TBool LinkedList::removeFromStart(T & data)
{
cout<<"Enter LinkedList::removeFromStart\n";
if (start == NULL)
{
cout<<"Underflow!!!..No elements added to List\n";
return False;
}

data = start->data;
Node * temp = start;
start = start->next;
delete(temp);
return True;
}

template
TBool LinkedList::removeFromEnd(T & data)
{
cout<<"Enter LinkedList::removeFromEnd\n";
if (start == NULL)
{
cout<<"Underflow!!!..No elements added to List\n";
return False;
}

Node * temp = start;

//Here we can directy check for temp->next != end..
//But why depend on end....?
//end is only for inserting...
while (temp->next->next != NULL)
{
temp = temp->next;
}

//Here temp->next = end;
//directly get the end

end = temp;
data = temp->next->data;
temp = temp->next;
end->next = NULL;
delete(temp);
return True;
};

template
TBool LinkedList::getDataFromStart(T & data)
{
cout<<"Enter LinkedList::getDataFromStart\n";
if (start == NULL)
{
cout<<"Underflow!!!..No elements added to List\n";
return False;
}

data = start->data;
return True;
}

template
TBool LinkedList::getDataFromEnd(T & data)
{
cout<<"Enter LinkedList::getDataFromEnd\n";
if (start == NULL)
{
cout<<"Underflow!!!..No elements added to List\n";
return False;
}

data = end->data;
return True;
}

template
void LinkedList::print()
{
Node * temp = start;
while (temp != NULL)
{
cout<data<<"\n";
temp = temp->next;
}
};

template
void LinkedList::makeNodeEmpty()
{
Node * temp = NULL;
while (start != NULL)
{
temp = start;
start = start->next;
delete(temp);
}
};
}

#endif

//-----------genericLinkedList.h ends here-----------------//


//--------------main.cpp starts here---------------//

#include "genericLinkedList.h"

int main()
{
cout<<"program started\n";
using namespace LIST;

LinkedList stack;

cout<<"Stack implementation using generic linked list ....\n";

char c = 0;

while (c != 'x' && c != 'X')
{
cout<<"\n\n\t1 --> insertAtStart";
cout<<"\n\t2 --> delete";
cout<<"\n\t3 --> print";
cout<<"\n\tx --> Exit";
cout<<"\n\n : ";

cin>>c;

switch(c)
{
case '1' :
{
int data;
cout<<"selected insert operation\n";
cout<<"insert value : ";
cin>>data;
stack.insertAtStart(data);
break;
}
case '2' :
{
int data;
cout<<"selected delete operation\n";
if (True == stack.removeFromStart(data))
{
cout<<"retrieved value = "<
}
break;
}
case '3' :
{
stack.print();
break;
}
case 'x' :
case 'X' :
{
break;
}
default:
{
cout<<"invalidOption!!\n";
}
}
}
return(0);
}

//--------------main.cpp ends here---------------//



feel free to comment for any suggestions or requests.....

0 comments:

Post a Comment

feel free to comment any issues or suggestion for my posts...