牛人请进(请帮帮忙)
我自己用模板写了一个连表结构,但在proj中却无法使用, 在workspace中的方法全部消失, 我看了看cList的原码, 但没有解决问题, 是能告诉我关键之所在!附代码如下:
/************************************************************
List.h
************************************************************/
//ListElement<T> class define
#include "afxtempl.h"
template <class T>
class LinkedList;
template <class T>
class ListElement
{
private:
T data;
ListElement* pNext;
//
ListEelment(const T&, ListElement*);
public:
const T& GetData() const;
const ListElement* GetNextNode() const;
//
friend LinkedList<T>;
};
/////////////////////////////////////////////
//ListElement<T> 的实现
template <class T>
ListElement<T>::ListEelment(const T& _data, ListElement<T>* _pNext)
{
data = _data;
pNext = _pNext;
}
template <class T>
const T& ListElement<T>::GetData() const
{
return data;
}
template <class T>
const ListElement<T>* ListElement<T>::GetNextNode() const
{
return pNext;
}
///////////////////////////////////////////////////////////////////////
//LinkedList<T> class define
template <class T>
class LinkedList
{
private:
ListElement<T>* pHead;
ListElement<T>* pTail;
public:
LinkedList();
~LinkedList();
LinkedList(LinkedList const&);
LinkedList& operator = (LinkedList const&);
const ListElement<T> * GetHeadNode() const;
const ListElement<T> * GetTailNode() const;
BOOL IsEmpty() const;
const T& GetFirst() const;
const T& GetLast() const;
void Prepend(const T&);
void Append(const T&);
void Extract(const T&);
void Purge();
void InsertAfter(const ListElement<T>*, const T&);
void InsertBefore(const ListElement<T>*, const T&);
};
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//LinkedList<T> 的实现
template <class T>
LinkedList<T>::LinkedList()
{
pHead = NULL;
pTail = NULL;
}
template <class T>
void LinkedList<T>::Purge()
{
while(pHead != NULL)
{
ListElement<T>* tmp = pHead;
pHead = pHead->pNext;
delete tmp;
}
pTail = NULL;
}
template <class T>
LinkedList<T>::~LinkedList()
{
Purge();
}
template <class T>
const ListElement<T>* LinkedList<T>::GetHeadNode() const
{
return pHead;
}
template <class T>
const ListElement<T>* LinkedList<T>::GetTailNode() const
{
return pTail;
}
template <class T>
BOOL LinkedList<T>::IsEmpty() const
{
return (pHead == NULL);
}
template <class T>
const T& LinkedList<T>::GetFirst() const
{
if(pHead == NULL)
throw domain_error("list is empty");
return pHead->data;
}
template <class T>
const T& LinkedList<T>::GetLast() const
{
if(pTail == NULL)
throw domain_error("list is empty");
return pTail->data;
}
template <class T>
void LinkedList<T>::Prepend(const T& item)
{
ListElement<T>* tmp = new ListElement<T> (item, pHead);
if(pHead == NULL)
pTail = tmp;
pHead = tmp;
}
template <class T>
void LinkedList<T>::Append(const T& item)
{
ListElement<T>* tmp = new ListElement<T>(item, NULL) ;
if(pHead == NULL)
{
pHead = tmp;
}
else
{
pTail->pNext = tmp;
}
pTail = tmp;
}
template <class T>
LinkedList<T>::LinkedList(const LinkedList<T>& linkedList)
{
pHead = NULL;
pTail = NULL;
const ListElement<T>* ptr;
for(ptr = linkedList.pHead; ptr != NULL; ptr = ptr->pNext)
Append(ptr->data);
}
template <class T>
LinkedList<T>& LinkedList<T>::operator =(const LinkedList<T>& linkedList)
{
if(&linkedList != this)
{
Purge();
const ListElement<T>* ptr;
for(ptr = linkedList.pHead; ptr != NULL; ptr = ptr->pNext)
Append(ptr->data);
}
return *this;
}
template <class T>
void LinkedList<T>::Extract(const T& item)
{
ListElement<T>* ptr = pHead;
ListElement<T>* prevPtr = NULL;
while(ptr != NULL && ptr->data != item)
{
prevPtr = ptr;
ptr = ptr->pNext;
}
if(ptr == NULL)
throw invalid_argument("item not found");
if(ptr == pHead)
pHead = ptr->pNext;
else
prevPtr->pNext = ptr->pNext;
if(ptr == pTail)
pTail = prevPtr;
delete ptr;
}
template <class T>
void LinkedList<T>::InsertAfter(const ListElement<T>* arg, const T& item)
{
ListElement<T>* ptr = const_cast<ListElement<T>*> (arg);
if(ptr == NULL)
throw invalid_argument("invalid position");
const ListElement<T>* tmp = new ListElement<T> (item, ptr->pNext);
ptr->pNext = tmp;
if(pTail == ptr)
pTail = tmp;
}
template <class T>
void LinkedList<T>::InsertBefore(const ListElement<T>* arg, const T& item)
{
ListElement<T>* ptr = const_cast<ListElement<T>*> (arg);
if(ptr == NULL)
throw invalid_argument("invalid position");
const ListElement<T>* tmp = new ListElement<T> (item, ptr);
if(pHead == ptr)
pHead = tmp;
else
{
ListElement<T>* prevPtr = pHead;
while(prevPtr != NULL && prevPtr->pNext != ptr)
prevPtr = prevPtr->pNext;
if(prevPtr == NULL)
throw invalid_argument("invalid position");
prevPtr->pNext = tmp;
}
}