|
参照网上的资料自己利用C++类方法进行了构造双向循环列表:
由于模板类的声明定义不能分开,否则编译器不能编译通过,所以将所有的类声明定义放到一个文件下
CDNode.h文件内容:
#pragma once
//声明一个结点的模板类,
template<class T>class CDbNode
{
public:
CDbNode(void);
CDbNode(T data);
CDbNode(CDbNode* left, CDbNode* right, T data);
~CDbNode(void);
T m_data;
CDbNode *m_left;
CDbNode *m_right;
};
//对结点进行构造
template<class T> CDbNode<T>::CDbNode(void)
: m_data(0)
, m_left(NULL)
, m_right(NULL)
{
}
template<class T>CDbNode<T>::CDbNode(T data)
: m_data(data)
, m_left(NULL)
, m_right(NULL)
{
}
template<class T>CDbNode<T>::CDbNode(CDbNode* left, CDbNode* right, T data)
: m_data(data)
, m_left(left)
, m_right(right)
{
}
template<class T>CDbNode<T>::~CDbNode(void)
{
}
//声明链表的模板类
template<class T>class CDbList
{
public:
CDbList(void);
CDbList(T data); //对链表的首结点进行了构造
~CDbList(void); //利用析构对链表进行及时的删除
CDbNode<T> *m_first; //定义一个结点指针
int getLen();
int insertNode(T data);
};
template<class T>CDbList<T>::CDbList(void)
: m_first(NULL)
{
}
template<class T>CDbList<T>::CDbList(T data)
{
m_first = new CDbNode<T>(data);
m_first->m_left = m_first->m_right = m_first;
}
template<class T>int CDbList<T>::getLen()
{
int nCount = 1;
CDbNode<T> *p = m_first;
if (p != m_first)
{
nCount++;
p = p->m_left;
}
return nCount;
}
template<class T>int CDbList<T>::insertNode(T data)
{
CDbNode<T> *p = m_first;
CDbNode<T> *q = NULL;
q = new CDbNode<T>(data);
if (NULL == q)
{
return FAILE;
}
q->m_left = p->m_left;
q->m_right = p;
p->m_right->m_left = q;
p->m_left = q;
return SUCCESS;
}
template<class T>CDbList<T>::~CDbList(void)
{
CDbNode<T> *p = m_first->m_left;
CDbNode<T> *q = NULL;
if(p != m_first)
{
q = p->m_right;
delete p;
p = q;
}
delete m_first;
}
其它的头文件(stdafx.h):
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
enum{
FAILE,
SUCCESS
};
主函数的文件内容:
#include "stdafx.h"
#include "DbNode.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;
CDbList<int> list(1);
list.insertNode(2);
list.insertNode(3);
list.insertNode(4);
a = list.getLen();
return 0;
}
|