您的位置:首页 > 编程语言 > C语言/C++

C++中的模板实例:链表模板

2008-12-23 15:16 288 查看
今天看了看C++中模板的概念,按照教程写了一个简单的链表模板:

//*********************

//** listtmp.h **

//*********************

#ifndef LIST

#define LIST

#include <iostream>

template<class T> class List{

public:

List();

void Add(T&);

void Remove(T&);

T* Find(T&);

T* Current();

void Restart();

void Next();

void PrintList();

~List();

protected:

struct Node{

Node* pNext;

T* pT;

};

Node *pFirst; //链首结点指针

Node *pCurpos; //当前节点

};

template<class T> List<T>::List()

{

pFirst = 0;

pCurpos = 0;

}

template<class T> T* List<T>::Current()

{

if(pCurpos)

return pCurpos->pT;

return 0;

}

template<class T> void List<T>::Restart()

{

if(pFirst)

pCurpos = pFirst;

else

pCurpos = 0;

}

template<class T> void List<T>::Next()

{

if(pCurpos)

pCurpos = pCurpos->pNext;

}

template<class T> void List<T>::Add(T& t)

{

Node* temp = new Node;

temp->pT =&t;

temp->pNext = pFirst;

pFirst = temp;

}

template<class T> void List<T>::Remove(T& t)

{

Node *q = 0; //待删结点

if(*(pFirst->pT)==t) //T类中==须有定义

{

q = pFirst;

pFirst = pFirst->pNext; //待删结点在链首时的脱链

}

else

{

for(Node* p=pFirst; p->pNext; p=p->pNext)

{ //顺链查找

if(*(p->pNext->pT)==t)

{

q = p->pNext;

p->pNext = q->pNext;

break;

}

}

}

if(q)

{

delete q->pT;

delete q;

}

}

template<class T> T* List<T>::Find(T& t)

{

for(Node* p=pFirst; p; p=p->pNext)

if(*(p->pT)==t)

return p->pT;

return 0;

}

template<class T> void List<T>::PrintList()

{

for(Node* p=pFirst; p; p=p->pNext)

cout <<*(p->pT)<<" "; //须有T的友元处理T对象输出

cout <<endl;

}

template<class T> List<T>::~List()

{

Node* p;

while(p = pFirst){

pFirst = pFirst->pNext;

delete p->pT;

delete p;

}

pFirst = 0;

}

#endif

并且创建了一个josephus问题的解决方案:

//******************************

//** Josephus问题解法六 **

//** jose6.cpp **

//******************************

#include <iostream>

#include "listtmp.h"

#include <iomanip>

using namespace std;

void Display(int);

void Step(int m);

void Init(int);

List<int> josephus; //创建单向链表模板类的全局对象

void main()

{

int n=9999, s=274, m=291; //随取三个合理的整数

//int* ap=

Init(n);

Step(s);

for(int i=1; i<n; i++){

Step(m);

int* tmp = josephus.Current();

Display(*tmp);

Step(1);//josephus.Next();

josephus.Remove(*tmp);

}

cout <<"\nThe winner is "<<*josephus.Current() << endl;

//delete[]ap;

}

//以下是构造链表,初始化结点编号的函数

void Init(int n)

{

//int* a = new int
;

for(int i=0; i<n; i++)

{

//a[i] = n - i;

Display(i+1);

josephus.Add(*new int(n - i));

}

Display ( -1 );

josephus.Restart(); //初始化迭代算子

//return a;

}

//以下是显示一个结点编号的函数

void Display(int n)

{

static int k;

if(n<0){

k = 0;

cout <<endl;

return;

}

cout <<setw(5) <<n;

if (!(++k%10))

cout <<endl;

}

//以下是要将指针从当前位置挪到往下数第m个结点的位置

void Step(int m)

{

for(int i=0; i<m; i++){

josephus.Next();

if(!josephus.Current()) //模拟环链表操作

josephus.Restart();

}

}

深入学习C++基础知识。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: