偶这个链表类 用了好久了,排除了好多不合理的地方,有些地方不愿意用STL的东东,感觉自己写的东东可以控制他并且修改之,一样可以运行得很好,而且有空就练习一下写标准C++的代码,尤其是想练习一下模板,封装抽象之类,拿来练手是一件很不错的事情。如果有幸被哪位采用了,偶会感到很荣幸。如果发现有不合理的地方请帮偶留言哟
/******************************************************************
* 文件名:QDList.h
* 文件说明:双向链表类
* gysoft
******************************************************************/
using namespace std;
#define NULL 0
#ifndef QDLIST_H
#define QDLIST_H
template <class T>
class QDList;
/*---双向链表节点类---*/
template <class T>
class QDListNode
{
friend QDList<T>;
private:
T data;
QDListNode<T> *left,*right;
};
/*---双向链表类---*/
template <class T>
class QDList
{
public:
QDList();
~QDList();
void RemoveAll();
void Append(const T& newData);
BOOL IsEmpty(ostream& out);
bool RemoveAt(int nPos);
int GetLength() const;
int Search(const T& x,int& nPos);
void Insert(int nPos,const T& x);
BOOL GetItem(int nPos, T&x);
//void SortItem();
private:
QDListNode<T>* LeftEnd;
QDListNode<T>* RightEnd;
int m_nLength;
};
/*---双向链表类::构造函数---*/
template <class T>
QDList<T>::QDList()
{
LeftEnd=RightEnd=NULL;
m_nLength=0;
}
/*---双向链表类::析构函数---*/
template <class T>
QDList<T>::~QDList()
{
RemoveAll();
}
/*---双向链表类::清空链表---*/
template <class T>
void QDList<T>::RemoveAll()
{
QDListNode<T>* curr=LeftEnd;
QDListNode<T>* next;
while(curr!=RightEnd)
{
next=curr->right;
delete curr;
curr=next;
}
if(RightEnd) delete RightEnd;
LeftEnd=RightEnd=NULL;
m_nLength=0;
};
/*---双向链表类::在链表尾部添加一个节点---*/
template <class T>
void QDList<T>::Append(const T& newData)
{
QDListNode<T>* newNode=new QDListNode<T>;
newNode->data=newData;
newNode->right=NULL;
if(LeftEnd)
{
newNode->left=RightEnd;
RightEnd->right=newNode;
RightEnd=newNode;
}
else
{
LeftEnd=RightEnd=newNode;
newNode->left=newNode->right=NULL;
LeftEnd=newNode;
}
m_nLength++;
}
/*---双向链表类::输出链表是否为空---*/
template <class T>
BOOL QDList<T>::IsEmpty(ostream& out)
{
if(!LeftEnd || m_nLength==0)
{
out<<"Empty List!";
return TRUE;
}
else
return FALSE;
}
/*---双向链表类::删除一个链表节点---*/
template <class T>
bool QDList<T>::RemoveAt(int nPos)
{
if(m_nLength==0)
{
LeftEnd=RightEnd=NULL;
return false;
}
QDListNode<T>* curr;
QDListNode<T>* next;
if(nPos<=0)
{
curr=LeftEnd;
next=curr->right;
delete curr;
LeftEnd=next;
}
else if(nPos>=m_nLength)
{
curr=RightEnd;
next=curr->left;
delete curr;
RightEnd=next;
}
else
{
curr=LeftEnd;
while(nPos)
{
curr=curr->right;
nPos--;
}
next=curr->right;
curr->left->right=next;
next->left=curr->left;
delete curr;
}
m_nLength--;
return true;
};
/*---双向链表类::得到链表长度---*/
template <class T>
int QDList<T>::GetLength() const
{
return m_nLength;
};
/*---双向链表类::在链表中查找一个元素---*/
template <class T>
int QDList<T>::Search(const T& x,int& nPos)
{
QDListNode<T>* curr=LeftEnd;
nPos=-1;
while(curr)
{
nPos++;
if(curr->data==x)
{
return nPos;
}
curr=curr->right;
}
nPos=-1;
return nPos;
};
/*---双向链表类::得到指定位置的值---*/
template <class T>
BOOL QDList<T>::GetItem(int nPos, T&x)
{
if(nPos<0 || nPos>m_nLength )
return FALSE;
QDListNode<T>* curr=LeftEnd;
while(nPos>1)
{
nPos--;
curr=curr->right;
}
x=curr->data;
return TRUE;
};
/*---双向链表类::在nPos处插入x---*/
template <class T>
void QDList<T>::Insert(int nPos,const T& x)
{
if(m_nLength==0)
{
Append(x);
return;
}
QDListNode<T>* newNode=new QDListNode<T>;
newNode->data=x;
if(nPos<=0)
{
newNode->right=LeftEnd;
newNode->left=newNode;
LeftEnd=newNode;
}
else if(nPos>=m_nLength)
{
newNode->left=RightEnd;
RightEnd->right=newNode;
RightEnd=newNode;
}
else
{
QDListNode<T>* curr=LeftEnd;
while(nPos>1)
{
nPos--;
curr=curr->right;
}
QDListNode<T>* next=curr->right;
newNode->left=curr;
curr->right=newNode;
newNode->right=next;
next->left=newNode;
}
m_nLength++;
};
#endif