<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Population</title>
</head>

<body>



<p align="center"><span lang="en-ca"><font size="6" color="#FF0000"><b>Data 
Structure Practice(</span>2<span lang="en-ca">)</span></b></font></p>

<div align="left">
  <pre><b><font color="#ff0000" size="5">A.Second Edition</font></b></pre>
</div>
<div align="left">
  <pre><b>This is second<span lang="en-ca"> edition of my practice of data structure, some of them are just a kind of copy of algorithms in </span></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>text. Actually not exact copying, I am trying to understand it by re-write by myself. Of course, for the unfamiliar</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>ones, I need to refer to text. </b></span><b><span lang="en-ca"> </span></b></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">B</span>.<span lang="en-ca"><a name="problem"></a>The problem</span></font></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>To write those data structure and  algorithms for practice. </b></font></span></pre>
</div>
<div align="left">
  <font FACE="CenturySchoolbook-BoldItalic" SIZE="3"><i><b></b></i></font>
</div>
<div align="left">
  <b><font color="#ff0000" size="5"><span lang="en-ca"><a name="explain"></a>C</span>.<span lang="en-ca">The
  </span></font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>idea of 
  program</b></font></span></div>
<div align="left">
  　</div>
<p><span lang="en-ca"><b>I am just practice by myself. </b></span></p>
<div align="left">
  <pre><b><font color="#ff0000" size="5">D.<span lang="en-ca"><a name="Method"></a>The </span>major functions</font></b></pre>
</div>
<div align="left">
  <pre><b><font size="3"><span lang="en-ca">1. BinNode&lt;int&gt;* createTree(int size)</span></font></b></pre>
</div>
<div align="left">
  <pre><font size="3"><b>2. void insertElem(BinNode&lt;int&gt;* root, int key)</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>These two function create a tree and return the root node pointer. The BST class actually wrapped </b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>the whole operations, and you cannot access the root. All you can do is issue a command and the BST</b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>finish it in a kind of &quot;black box&quot;, like &quot;print&quot;, &quot;find&quot;, &quot;insert&quot;. So, I have to write &quot;insert&quot; </b></font></pre>
</div>
<div align="left">
  <pre><font size="3"><b>by myself, otherwise you can never get the &quot;root&quot; pointer. In order to check my algorithm,<span lang="en-ca"> I let </span></b></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>a BST object to print out the tree by inserting same data into it which makes it an mirror of my tree.</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>3. void displayTree(BinNode&lt;int&gt;* root)</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>This function tries to display the tree level by level and it is quite painful! I used an array to </b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>record number of nodes of each level. But the boundary condition is always a tricky part.</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>4. int heightTree(BinNode&lt;int&gt;* root)</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>5. int levelTree(BinNode&lt;int&gt;* root, int level, bool belowLevel)</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>These functions are supposed to find out the height of tree or number of nodes in a specific level.</b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>The second one also combines the function of sum up total number of nodes below specific level </b></font></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3"><b>(inclusive).
</b></font></span></pre>
</div>
<div align="left">
  <pre>　</pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">C</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>Further improvement</b></font></span></pre>
</div>
<div align="left">
  <pre>　</pre>
</div>
<pre>#include &lt;iostream&gt;
#include &lt;iomanip&gt;
#include &lt;time.h&gt;
#include &quot;Link.h&quot;
#include &quot;AList.h&quot;
#include &quot;BST.h&quot;
#include &quot;AQueue.h&quot;
#include &quot;Queue.h&quot;

using namespace std;

class KEComp
{
public:
	static bool lt(int key, int elem) {return key&lt;elem;}
	static bool eq(int key, int elem) {return key==elem;}
	static bool gt(int key, int elem) {return key&gt;elem;}
};

const int Range=100;

const int MaxArraySize=35;

int array[MaxArraySize]={0};

Link&lt;int&gt;* list[MaxArraySize];

void displayList(Link&lt;int&gt;* ptr);

Link&lt;int&gt;* createList(int* array, int size);

Link&lt;int&gt;* reverseList(Link&lt;int&gt;* ptr);

void quksort(Link&lt;int&gt;** ptr, int size);

int partition(Link&lt;int&gt;**ptr, int l, int r);

void displayArray(Link&lt;int&gt;**ptr, int size);

void buildHeap(Link&lt;int&gt;**ptr, int size);

void swap(Link&lt;int&gt;** ptr, int x, int y);

void siftDown(Link&lt;int&gt;**ptr, int index, int size);

void heapSort(Link&lt;int&gt;**ptr, int size);

AList&lt;int&gt;* eliminate(AList&lt;int&gt;* l1, AList&lt;int&gt;* l2);

void getTwoList(AList&lt;int&gt;*&amp; l1, AList&lt;int&gt;*&amp; l2);

void createList(AList&lt;int&gt;*&amp; l, int array[], int size);

void displayList(AList&lt;int&gt;* lst);

void mergeSort(int array[], int size);

bool findVal(AList&lt;int&gt;* l, int key);

AList&lt;int&gt;* eliminate2(AList&lt;int&gt;* l1, AList&lt;int&gt;* l2);

void displayTree(BinNode&lt;int&gt;* root);

BinNode&lt;int&gt;* createTree(int size);

void insertElem(BinNode&lt;int&gt;* root, int key);

int heightTree(BinNode&lt;int&gt;* root);

int numberTree(BinNode&lt;int&gt;* root);

int levelTree(BinNode&lt;int&gt;* root, int level, bool belowLevel=false);

int max(int i, int j);

int main()
{
	srand(time(0));
	/*
	//this is a strange combination, a link list with pointer also resided in
	//an sorted array
	int size=MaxArraySize;
	Link&lt;int&gt;* pHead;
	pHead=createList(array, size);
	displayList(pHead);
	cout&lt;&lt;&quot;try to reverse\n&quot;;
	pHead = reverseList(pHead);
	displayList(pHead);
	cout&lt;&lt;&quot;now try to build heap\n&quot;;
	buildHeap(list, size);
	heapSort(list, size);
	displayArray(list, size);
	//try quick sort of link list
	cout&lt;&lt;&quot;now try to sort the array, before sort\n&quot;;
	displayArray(list, size);
	quksort(list, size);

	displayArray(list, size);

	//this is a problem proposed by professor in review class:
	//given two lists to generate a third list without those common element of two
	//and keep two lists unchanged.
	AList&lt;int&gt;*l1, *l2, *l3;
	createList(l1, array, 10);
	cout&lt;&lt;&quot;l1 is:\n&quot;;
	displayList(l1);
	cout&lt;&lt;&quot;l2 is:\n&quot;;
	createList(l2, array, 15);
	displayList(l2);
	cout&lt;&lt;&quot;now l3 is:\n&quot;;
	l3=eliminate2(l1, l2);//this is second approach
	displayList(l3);
	*/
	BinNode&lt;int&gt;* root;
	int height=0;

	root = createTree(25);
	cout&lt;&lt;&quot;now display my way\n&quot;;
	displayTree(root);

	cout&lt;&lt;&quot;tree data\n&quot;;
	height=heightTree(root);
	cout&lt;&lt;&quot;the height of tree:&quot;&lt;&lt;height&lt;&lt;endl;
	cout&lt;&lt;&quot;the total number of nodes:&quot;&lt;&lt;numberTree(root)&lt;&lt;endl;
	for (int i=0; i&lt;height; i++)
	{
		cout&lt;&lt;&quot;level &quot;&lt;&lt;i&lt;&lt;&quot; has number of nodes&quot;&lt;&lt;levelTree(root, i)&lt;&lt;endl;
		cout&lt;&lt;&quot;and below level &quot;&lt;&lt;i&lt;&lt;&quot; has number of nods:&quot;&lt;&lt;levelTree(root, i, true)&lt;&lt;endl;
	}

	cout&lt;&lt;endl;

	return 0;
}

int levelTree(BinNode&lt;int&gt;* root, int level, bool belowLevel)
{
	int levelCount[MaxArraySize]={0};
	BinNode&lt;int&gt;* temp;
	int lvl=0, total=0;
	AQueue&lt;BinNode&lt;int&gt;*&gt; Q;
	if (!belowLevel)
	{
		if (root!=NULL&amp;&amp;level==0)
		{
			return 1;
		}
	}
	Q.enqueue(root);
	levelCount[lvl]=1;
	do
	{
		Q.dequeue(temp);
		levelCount[lvl]--;
		if (lvl&gt;=level)
		{
			total++;
		}
		if (temp-&gt;left()!=NULL)
		{
			Q.enqueue(temp-&gt;left());
			levelCount[lvl+1]++;
		}
		if (temp-&gt;right()!=NULL)
		{
			Q.enqueue(temp-&gt;right());
			levelCount[lvl+1]++;
		}
		if (levelCount[lvl]==0)
		{
			lvl++;
		}
		if (!belowLevel)
		{
			if (lvl==level)
			{
				return levelCount[lvl];
			}
		}
	}while (Q.length()!=0);
	if (!belowLevel)
	{
		return 0; //as there is no such level
	}
	else
	{
		return total;
	}
}

int numberTree(BinNode&lt;int&gt;* root)
{
	if (root==NULL)
	{
		return 0;
	}
	else
	{
		return 1+ numberTree(root-&gt;left())+numberTree(root-&gt;right());
	}
}

int max(int i, int j)
{
	return i&gt;j?i:j;
}

int heightTree(BinNode&lt;int&gt;* root)
{
	if (root==NULL)
	{
		return 0;
	}
	else
	{
		return 1+ max(heightTree(root-&gt;left()), heightTree(root-&gt;right()));
	}
}

void insertElem(BinNode&lt;int&gt;* root, int key)
{
	BinNode&lt;int&gt;* temp;
	if (key&lt;root-&gt;val())
	{
		if (root-&gt;left()==NULL)
		{
			temp=new BinNodePtr&lt;int&gt;(key);
			root-&gt;setLeft(temp);
			return;
		}
		else
		{
			insertElem(root-&gt;left(), key);
		}
	}
	else
	{
		if (root-&gt;right()==NULL)
		{
			temp=new BinNodePtr&lt;int&gt;(key);
			root-&gt;setRight(temp);
			return ;
		}
		else
		{
			insertElem(root-&gt;right(), key);
		}
	}
}


BinNode&lt;int&gt;* createTree(int size)
{
	BinNode&lt;int&gt;* root;
	BST&lt;int, int, KEComp, KEComp&gt; tree;

	//make sure the root is not null
	root=new BinNodePtr&lt;int&gt;(rand()%100);
	tree.insert(root-&gt;val());
	for (int i=0; i&lt;size-1; i++)
	{		
		int k=rand()%100;
		insertElem(root, k);
		tree.insert(k);
	}
	tree.print();
	return root;
}

void displayTree(BinNode&lt;int&gt;* root)
{
//	const int middle=35;
//	const int width=8;
	AQueue&lt;BinNode&lt;int&gt;*&gt; Q;
	BinNode&lt;int&gt;* current;
	int levelCounter[10]={0};
	int level=0;
//	Q.clear();
	Q.enqueue(root);
	current=root;
	levelCounter[level]++;
//	cout&lt;&lt;setw(middle);
	do
	{
		Q.dequeue(current);
		cout&lt;&lt;current-&gt;val()&lt;&lt;&quot;  &quot;;
		levelCounter[level]--;

		if (current-&gt;left()!=NULL)
		{
			Q.enqueue(current-&gt;left());
			levelCounter[level+1]++;
		}
		if (current-&gt;right()!=NULL)
		{
			Q.enqueue(current-&gt;right());
			levelCounter[level+1]++;
		}
	


		if (levelCounter[level]==0)
		{
			level++;
			cout&lt;&lt;&quot;\n&quot;;
//			cout&lt;&lt;setw(middle-level*width);
		}
	}while (Q.length()!=0);
}


	


AList&lt;int&gt;* eliminate2(AList&lt;int&gt;* l1, AList&lt;int&gt;* l2)
{
	int i;
	AList&lt;int&gt;* l;

	l1-&gt;setStart();
	l2-&gt;setStart();
	l =new AList&lt;int&gt;(l1-&gt;rightLength()+l2-&gt;rightLength());
	while (l1-&gt;getValue(i))
	{
		if (!findVal(l2, i))
		{
			l-&gt;append(i);
		}
		l1-&gt;next();
	}

	l2-&gt;setStart();
	while (l2-&gt;getValue(i))
	{
		if (!findVal(l1, i))
		{
			l-&gt;append(i);
		}
		l2-&gt;next();
	}
	return l;
}



void createList(AList&lt;int&gt;*&amp; l, int array[], int size)
{
	l=new AList&lt;int&gt;;
	for (int i=0; i&lt;size; i++)
	{
		array[i]=rand()%Range;
	}
	mergeSort(array, size);
	for (i=0; i&lt;size; i++)
	{
		l-&gt;append(array[i]);
	}
}



void doMergeSort(int array[], int temp[], int left, int right)
{
	int mid= (left+right)/2;
	int n1, n2;
	if (left==right)
	{
		return;
	}
	doMergeSort(array, temp, left, mid);
	doMergeSort(array, temp, mid+1, right);
	for (int i=left; i&lt;=right; i++)
	{
		temp[i]=array[i];
	}
	n1=left; 
	n2=mid+1;
	for (i=left; i&lt;=right; i++)
	{
		if (n1==mid+1)
		{
			array[i]=temp[n2];
			n2++;
		}
		else
		{
			if (n2==right+1)
			{
				array[i]=temp[n1];
				n1++;
			}
			else
			{
				if (temp[n1]&lt;temp[n2])
				{
					array[i]=temp[n1];
					n1++;
				}
				else
				{
					array[i]=temp[n2];
					n2++;
				}
			}
		}
	}
}

void mergeSort(int array[], int size)
{
	void doMergeSort(int array[], int temp[], int left, int right);
	int temp[MaxArraySize];
	doMergeSort(array, temp, 0, size-1);
}

void displayList(AList&lt;int&gt;* lst)
{
	int i;
	lst-&gt;setStart();
	while (lst-&gt;getValue(i))
	{
		cout&lt;&lt;i&lt;&lt;&quot;  &quot;;
		lst-&gt;next();
	}
	cout&lt;&lt;endl;
}


void getTwoList(AList&lt;int&gt;*&amp; l1, AList&lt;int&gt;*&amp; l2)
{
	l1=new AList&lt;int&gt;;
	l2=new AList&lt;int&gt;;
	for (int i=0; i&lt;10; i++)
	{
		l1-&gt;append(rand()%100);
		l2-&gt;append(rand()%100);
	}
	//make l1 longer
	for (i=0; i&lt;5; i++)
	{
		l1-&gt;append(rand()%100);
	}
}


bool findVal(AList&lt;int&gt;* l, int key)
{
	int i;
	l-&gt;setStart();
	while (l-&gt;getValue(i))
	{
		if (key==i)
		{
			return true;
		}
		else
		{
			if (key&lt;i)
			{
				return false;
			}
		}
		l-&gt;next();
	}
	return false;
}


int min(int i, int j)
{
	if (i&lt;j)
	{
		return i;
	}
	else
	{
		return j;
	}
}

//the idea is quite similar to merge operation of merge sort.
AList&lt;int&gt;* eliminate(AList&lt;int&gt;* l1, AList&lt;int&gt;* l2)
{

	int min(int i, int j);

	bool leftDone=false;
	int i, j, same;

	//assume both list has at least one element
	l1-&gt;setStart();
	l2-&gt;setStart();

	AList&lt;int&gt;* l =new AList&lt;int&gt;(l1-&gt;rightLength()+l2-&gt;rightLength());
	l-&gt;setStart();

	l1-&gt;getValue(i);
	l2-&gt;getValue(j);
	while (true)
	{	
		//if they are not equal, so it should be added, 
		//but the only smaller one we are sure, as the smaller 
		//has no more chance to get equal from other list.
		//And we push the list with the smaller one to 
		//get more value. 
		if (i!=j)
		{
			if (i&lt;j)
			{
				if (i!=same)
				{
					l-&gt;append(i);
				}
				l1-&gt;next();//keep left moving
				//also push the ball going always from the smaller side
				if (!l1-&gt;getValue(i))
				{
					leftDone=true;//book keeping which side makes the while loop end
					break;
				}
			
			}
			else
			{
				if (j!=same)
				{
					l-&gt;append(j);
				}
				l2-&gt;next();//keep right moving
				if (!l2-&gt;getValue(j))
				{
					leftDone=false; //make sure it is false
					break;				
				}
				
			}
		}
		else
		{
			same=i;//same just to record the last same number
			//in case they get same value, we know, we have to push both side going
			l1-&gt;next();
			l2-&gt;next();
			if (!l1-&gt;getValue(i))
			{
				leftDone=true;//book keeping which side makes the while loop end
				break;
			}
			if (!l2-&gt;getValue(j))
			{
				leftDone=false;
				break;
			}
		
		}
	}
	if (leftDone)
	{
		if (i!=j)//this means last time, we have not insert j.
		{
			l-&gt;append(j);			
		}
		l2-&gt;next();
		while (l2-&gt;getValue(j))
		{
			if (i!=j)//this means last time, we have not insert j.
			{
				l-&gt;append(j);			
			}
			l2-&gt;next();
		}
	}
	else
	{
		if (i!=j)//this means last time, we have not insert i.
		{
			l-&gt;append(i);			
		}
		l1-&gt;next();//we need move even i==j
		while (l1-&gt;getValue(i))
		{
			if (i!=j)//this means last time, we have not insert j.
			{
				l-&gt;append(i);			
			}
			l1-&gt;next();
		}
	}
	return l;
}


void heapSort(Link&lt;int&gt;**ptr, int size)
{
	for (int i=size-1; i&gt;0; i--)
	{
		swap(ptr, i, 0);
		siftDown(ptr, 0, i);
	}
}


void buildHeap(Link&lt;int&gt;**ptr, int size)
{
	for (int i=size/2-1; i&gt;=0; i--)
	{
		siftDown(ptr, i, size);
	}
}

void siftDown(Link&lt;int&gt;**ptr, int index, int size)
{
	int l, r;
	l=index*2+1;
	r=index*2+2;
	if (size==1)
	{
		return;
	}
	if (r&lt;size)
	{
		if (ptr[l]-&gt;element&lt;ptr[r]-&gt;element)
		{
			l=r;	
		}
	}
	if (ptr[index]-&gt;element&lt;ptr[l]-&gt;element)
	{
		swap(ptr, index, l);
		if (l&lt;=size/2-1)
		{
			siftDown(ptr, l, size);
		}
	}

}

void displayArray(Link&lt;int&gt;**ptr, int size)
{
	for (int i=0; i&lt;size; i++)
	{
		cout&lt;&lt;ptr[i]-&gt;element&lt;&lt;&quot;  &quot;;
	}
	cout&lt;&lt;endl;
}

void doQukSort(Link&lt;int&gt;** ptr, int l, int r)
{
	if (r&gt;l)
	{
		int mid;
		mid=partition(ptr, l, r);
		doQukSort(ptr, 0, mid-1);
		doQukSort(ptr, mid+1, r);
	}
}

void quksort(Link&lt;int&gt;** ptr, int size)
{
	void doQukSort(Link&lt;int&gt;** ptr, int l, int r);

	doQukSort(ptr, 0, size-1);
}

void swap(Link&lt;int&gt;** ptr, int x, int y)
{
	Link&lt;int&gt;* temp=ptr[x];
	ptr[x]=ptr[y]; 
	ptr[y]=temp;
}

int partition(Link&lt;int&gt;** ptr, int start, int end)
{
	
	Link&lt;int&gt;* pivot=ptr[end];
	int l=-1, r=end-1;
	while (r&gt;l)
	{
		do 
		{
			l++;
		} while (l&lt;end&amp;&amp;ptr[l]-&gt;element&lt;=pivot-&gt;element);
		do 
		{
			r--;
		} while (r&gt;=0&amp;&amp;ptr[r]-&gt;element&gt;=pivot-&gt;element);
		swap(ptr, l, r);
	}
	swap(ptr, l, r);
	swap(ptr, l, end);
	return l;
}



void displayList(Link&lt;int&gt;* ptr)
{
	Link&lt;int&gt;* temp=ptr;
	while (temp!=NULL)
	{
		cout&lt;&lt;temp-&gt;element&lt;&lt;&quot;  &quot;;
		temp=temp-&gt;next;
	}
	cout&lt;&lt;endl;
}

Link&lt;int&gt;* reverseList(Link&lt;int&gt;* ptr)
{
	Link&lt;int&gt;* head,* pre=NULL, *nxt;
	if (ptr==NULL)
	{
		cout&lt;&lt;&quot;empty list!\n&quot;;
		return NULL;
	}
	head=ptr-&gt;next;
	if (head==NULL)
	{
		return ptr;
	}
	nxt=head-&gt;next;
	pre=ptr;
	head-&gt;next=pre;
	pre-&gt;next=NULL;

	while (nxt!=NULL)
	{
		pre=head;
		head=nxt;
		nxt=nxt-&gt;next;
		head-&gt;next=pre;
	}
	return head;
}

Link&lt;int&gt;* createList(int* array, int size)
{
	Link&lt;int&gt;* head, *ptr, *temp;
	if (size&lt;=0)
	{
		return NULL;
	}

	for (int i=0; i&lt;size; i++)
	{
		array[i]=rand()%100;
		ptr =new Link&lt;int&gt;(array[i]);
		if (i==0)
		{
			head=ptr;
		}
		else
		{
			temp-&gt;next=ptr;		
		}
		temp = ptr;
		list[i]=ptr;
	}
	return head;
}

</pre>
<pre>

</pre>
<pre><font color="#0000FF"><b>Here is the result:</b></font></pre>
<pre>        0
      3
        3
    8
        10
          11
      13
            13
          16
            27
        29
  31
35
    48
          50
        52
          52
      58
        62
          73
  77
      82
    90
      94
        94
now display my way
35
31  77
8  48  90
3  13  58  82  94
0  3  10  29  52  62  94
11  16  50  52  73
13  27
tree data
the height of tree:7
the total number of nodes:25
level 0 has number of nodes1
and below level 0 has number of nods:25
level 1 has number of nodes2
and below level 1 has number of nods:24
level 2 has number of nodes3
and below level 2 has number of nods:22
level 3 has number of nodes5
and below level 3 has number of nods:19
level 4 has number of nodes7
and below level 4 has number of nods:14
level 5 has number of nodes5
and below level 5 has number of nods:7
level 6 has number of nodes2
and below level 6 has number of nods:2

Press any key to continue</pre>
<pre>　</pre>
<pre></pre>
<pre>　</pre>

<pre></pre>

<pre></pre>
<pre>	
</pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                                   
&nbsp;&nbsp;&nbsp; <a href="WhoAmI.htm">                  







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm"><img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">          


</p>

</body>

</html>