#include <iostream>
using namespace std;
template<class T>
class node
{
public:
node():next(NULL) {}
node(const T&value, node<T> *nextValue = NULL) :
value_(value),next(nextValue) {}
T getValue()
{
return value_;
}
public:
node<T> *next;
int value_;
};
template<class T>
void show(const node<T> *value)
{
if (value)
{
const node<T> *p = value;
while(p)
{
cout<<p->value_<<"/n";
p = p->next;
}
}
}
template<class T>
void DeleteValue(node<T>* value)
{
while( value)
{
node<T> *p = value;
value = value->next;
delete p;
}
}
// at proper position insert a value by less sort
template<class T>
node<T> * AddValue(node<T> *pValue, T value)
{
node<T> *head = pValue;
node<T> *newNode = NULL;
node<T> *prev = pValue, *curr = pValue;
newNode = new node<T>(value);
bool bfind = false;
if ( value > pValue->value_)
{
newNode->next = pValue;
head = newNode;
bfind = true;
}
while(curr &&!bfind)
{
if( (value < (prev->value_) ) && (value > curr->value_) )
{
prev->next = newNode;
newNode->next = curr;
bfind = true;
}
else if(curr != NULL && NULL ==curr->next)
{
curr->next = newNode;
bfind = true;
}
else
{
prev = curr;
curr = curr->next;
}
}
return head;
}
//Delete a special value
template<class T>
void DeleteSpeValue(node<T> * &front,const T& value)
{
node<T> *prev = NULL, *curr = front;
bool bfind = false;
while (curr != NULL && !bfind)
{
if (value == curr->value_)
{
if (NULL == prev)
{
front = front->next;
delete curr;
bfind = true;
}
else
{
prev->next = curr->next;
delete curr;
bfind = true;
}
}
else
{
prev = curr;
curr = curr->next;
}
}
}
template<class T>
bool Find(const node<T> *first, T value)
{
bool bfind = false;
const node<T> *p = first;
while( p && !bfind)
{
if (value == p->value_)
bfind = true;
else
p = p->next;
}
return bfind;
}
int main()
{
node<int> *front = NULL, *newNode= NULL, *head= NULL,*back= NULL;
for (int i = 0; i < 5; ++i)
{
front = new node<int>(i*2 +i, front);
}
//node<int> *result = AddValue<int>(front,21);
//DeleteSpeValue(front, 12);
cout<<"find value "<<Find(front,112)<<"/n" ;
show<int>(front);
DeleteValue<int>(front);
return 0;
}