类模板都是以template开头写起,模式如下:
template//其中class 是固定格式 type 可以指向任何一个数据的类型 如double等。 //函数模板可如下写出 type 函数名称(参数1,参数2) //类模板如下 class 类名 { 数据成员 成员函数 };
<>内为模板参数,模板参数主要分为两种:
一种是模板类型参数,另一种是模板非类型参数.
当模板被调用时,模板中的代码才会被执行。也就相当于一个实例,称为模板类或模板函数.
创建一个链表类模板步骤如下:
1.先创造一个类模板
templateclass 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("tt姓名tt号码n"); printf("tt%stt%dn",ptmp->name,ptmp->num); for(int i = 1; i < m_nodesum; i++) { ptmp=ptmp->next; //获取下一个节点 printf("tt%stt%dn",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 nodelist; //构造一个类模板实例
cout<<"请输入成员个数:"<>n;
cout<<"请输入成员信息:"<>pnode->name>>pnode->num;
nodelist.addnode(pnode); //将其添加到链表中
}
nodelist.passlist(); //遍历链表输出
return 0;
}
运行结果如下:
此链表模板可以应用任意一个程序之中,只要自己创建一个类模板实例即可,不需要将所有的代码重新再敲一遍,这样节省了很多时间。例如我们现在要创建一个球队的数据,只需要知道球队几个人以及各个人的姓名以及球衣的号码即可。
clistbasketballteam; cout<<"请输入球队成员个数:"< >n; cout<<"请输入球队成员信息:"< >pnode->name>>pnode->num; basketballteam.add(pnode); } basketballteam.passlist();
如上代码,我们还可以将其改为通讯录的保存或者班级成员的信息保存链表。
只需要构造一个模板实例 将名字改为我们所需要的名字,输入输出数据也可以发生更改,只需要在链表类模板中将其遍历的函数中输出的结构改变即可。
第一篇博客就到这里了,本人(c++小白)只是将自己理解的链表模板类写出来,如果以上有什么细节出现了问题希望各位大佬帮助更改,虚心学习.本人随心情更新博客不进任何实验室,不喜欢被催着的感觉,喜欢自由在,也同样希望可以和大佬一起讨论问题。



