类模板都是以template开头写起,模式如下:
template<class type> //其中class 是固定格式 type 可以指向任何一个数据的类型 如double等。
//函数模板可如下写出
type 函数名称(参数1,参数2)
//类模板如下
class 类名
{
数据成员
成员函数
};
<>内为模板参数,模板参数主要分为两种:
一种是模板类型参数,另一种是模板非类型参数.
当模板被调用时,模板中的代码才会被执行。也就相当于一个实例,称为模板类或模板函数.
创建一个链表类模板步骤如下:
1.先创造一个类模板
template<class type>
class clist //类模板
{
private: //类中的私有成员
type *pheader; //创造一个头结点 可以是任意数据结构的头结点
int m_nodesum; //节点数量
public:
clist() //构造函数
{
pheader = NULL;
m_nodesum = 0;
//给每个数据初始化
}
type *movetrial() //获取尾结点的函数
{
type *ptemp = pheader; //定义一个临时节点将其指向头结点
for(int i = 1; i < m_nodesum; i++)
{
ptemp->ptemp->next; //next指向下一个节点的指针,在后续的类中出现。
}
return ptemp;
}
void addnode(type *pnode) //添加节点的函数
{
if(m_nodesum == 0) //判断链表是否为空
{
pheader=pnode;
}
else
{
type *ptrail = movetrial(); //获取尾结点的位置
ptrail->next = pnode;
}
m_nodesum++; //每次多一个数据存储时节点数加一
}
void passlist()
{
if(m_nodesum > 0)
{
type *ptmp = pheader; //定义一个临时节点方便遍历链表
printf("\t\t姓名\t\t号码\n");
printf("\t\t%s\t\t%d\n",ptmp->name,ptmp->num);
for(int i = 1; i < m_nodesum; i++)
{
ptmp=ptmp->next; //获取下一个节点
printf("\t\t%s\t\t%d\n",ptmp->name,ptmp->num);
}
}
}
~clist() //类中的析构函数,将所有的数据都进行删除处理
{
if(m_nodesum > 0)
{
type *pdelete = pheader;
type *t=NULL;
for(int i = 0; i < m_nodesum; i++)
{
t = pdelete->next; // 保存链表后一个未被删除的数据
delete pdelete; //释放当前节点
pdelete = t;
}
m_nodesum = 0;
pdelete = NULL;
t = NULL;
}
pheader = NULL;
}
};
链表的类模板完成后,要出现一个参数类来代替其中的type。并起到可以保存数据的作用,可以使用类或者结构体都可以完成本操作。(其中结构体和类的一个区别是:结构体中不能有成员函数,但是类中可以有成员函数)。
2.完成上述的一个参数类
利用这个类来代替上述链表类中的type,用来保存数据
class cnode
{
public:
cnode *next;
char name[28];
int num;
cnode()
{
next = NULL;
}
};
3.写出主函数:
代码如下:
int main()
{
int n;
clist<cnode> nodelist; //构造一个类模板实例
cout<<"请输入成员个数:"<<endl;
cin>>n;
cout<<"请输入成员信息:"<<endl;
for(int i=0;i<n;i++)
{
node *pnode=new cnode(); //给cnode类开辟一个空间保存数据
cin>>pnode->name>>pnode->num;
nodelist.addnode(pnode); //将其添加到链表中
}
nodelist.passlist(); //遍历链表输出
return 0;
}
运行结果如下:
此链表模板可以应用任意一个程序之中,只要自己创建一个类模板实例即可,不需要将所有的代码重新再敲一遍,这样节省了很多时间。例如我们现在要创建一个球队的数据,只需要知道球队几个人以及各个人的姓名以及球衣的号码即可。
clist<cnode> basketballteam;
cout<<"请输入球队成员个数:"<<endl;
cin>>n;
cout<<"请输入球队成员信息:"<<endl;
for(int i=0;i<n;i++)
{
node *pnode=new node();
cin>>pnode->name>>pnode->num;
basketballteam.add(pnode);
}
basketballteam.passlist();
如上代码,我们还可以将其改为通讯录的保存或者班级成员的信息保存链表。
只需要构造一个模板实例 将名字改为我们所需要的名字,输入输出数据也可以发生更改,只需要在链表类模板中将其遍历的函数中输出的结构改变即可。
第一篇博客就到这里了,本人(c++小白)只是将自己理解的链表模板类写出来,如果以上有什么细节出现了问题希望各位大佬帮助更改,虚心学习.本人随心情更新博客不进任何实验室,不喜欢被催着的感觉,喜欢自由在,也同样希望可以和大佬一起讨论问题。