链表类模板的基本应用(c++)

类模板都是以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++小白)只是将自己理解的链表模板类写出来,如果以上有什么细节出现了问题希望各位大佬帮助更改,虚心学习.本人随心情更新博客不进任何实验室,不喜欢被催着的感觉,喜欢自由在,也同样希望可以和大佬一起讨论问题。

  • 11
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小侯不躺平.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值