Sunday, November 22, 2009

write template for linkedlist


#ifndef __DLL_H__
#define __DLL_H__
template < class T >
class DLinkedList;
template < class Type >
class DNode{
Type data;
DNode < Type >* next;
DNode < Type >* prev;
DNode(Type data, DNode < Type > * prev = (DNode < Type > *)0, DNode < Type > * next = (DNode < Type > *)0);
friend class DLinkedList < Type >;
};
template < class T >
class DLinkedList{
DNode < T >* head;
DNode < T >* cur;
DNode < T >* tail;
public:
DLinkedList(void);
~DLinkedList(void);
void Add(T data);
bool IsEmpty(void);
T Remove(void);
bool GoNext(void);
bool GoPrev(void);
bool GoHead(void);
bool GoTail(void);
T Visit(void);
T& operator[](T index);
};
#endif

#include "LL.h"
template < class T >
DNode < T > ::DNode(T data, DNode < T > * prev, DNode < T > * next){
this->data = data;
this->prev = prev;
this->next = next;
}

template < class T >
DLinkedList < T > ::DLinkedList(void){
head = tail = cur = (DNode < T > *)0;
}
template < class T >
DLinkedList < T > ::~DLinkedList(void){
while(!IsEmpty()) Remove();
}
template < class T >
void DLinkedList < T > ::Add(T data){
DNode < T > * temp = new DNode < T > (data, tail);
if(tail){
tail->next = temp;
tail = temp;
}
else{
head = tail = cur = temp;
}
}
template < class T >
bool DLinkedList < T > ::IsEmpty(void){
return !cur;
}
template < class T >
int DLinkedList < T > ::Remove(void){
T data = 0;
return data;
}
template < class T >
bool DLinkedList < T > ::GoNext(void){
bool res = false;
if(cur != tail){
cur = cur->next;
res = true;
}
return res;
}
template < class T >
bool DLinkedList < T > ::GoPrev(void){
bool res = false;
if(cur != head){
cur = cur->prev;
res = true;
}
return res;
}
template < class T >
bool DLinkedList < T > ::GoHead(void){
bool res = false;
if(cur){
cur = head;
res = true;
}
return res;
}
template < class T >
bool DLinkedList < T > ::GoTail(void){
bool res = false;
if(cur){
cur = tail;
res = true;
}
return res;
}
template < class T >
T DLinkedList < T > ::Visit(void){
return cur->data;
}
template < class T >
T& DLinkedList < T > ::operator[](T index){
Node < T > * temp = head;
if (cur == head){
GoNext();
}
head = head -> next;
head -> prev = (Node < T > *) 0;
T d = temp -> data;
delete temp;
return d;
}

No comments:

Post a Comment