链表C++模板类封装实现

 

目录

头文件.h

.hpp文件(实际是cpp文件 二次编译模板类)

main自定义抽象类Teacher_11测试函数

测试结果:


c++模板类实现链表 可以应用于任何数据类型

头文件.h

模板类定义 创建链表(构造函数) 插入操作 删除操作 清空操作 获取节点 返回长度

#pragma once
#include"iostream"

using namespace std;

template<typename T>
struct node
{
	node<T>*next;//写在第一行避免偏移量操作
	T data;
};//模板类底层要用的节点数据结构 也可以定义在模板类内部

template<typename T>
class LinkList
{
public:
	LinkList();
	~LinkList();
	void LinkListClear();
	int getlen();//返回长度
	int insert(int pos, T&node);//指定位置插入节点
	int getNode(int pos, T&node);//获取指定位置节点
	int LinkListDelete(int pos, T&node);//删除指定位置节点

private:
	node<T>*head;
	int len;
};




 

.hpp文件(实际是cpp文件 二次编译模板类)

不同于c节点内存单元由主调函数分派 c++模板类底层自己开辟管理内存空间

#include"dm_11_linklistTemplate.h"


template<typename T>
	LinkList<T>::LinkList()//构造函数 创建链表 无需像c特意的句柄 类的私有成员head 和len即可
	{
		head = new node<T>;
		head->next = NULL;
		len = 0;
	}
	template<typename T>
	LinkList<T>::~LinkList()//析构函数 调用完毕析构空间
	{
		node<T>*tmp = NULL;
		while(head != NULL)
		{
			tmp = head->next;
			delete head;
			head = tmp;
		}
	}

	template<typename T>
	void LinkList<T>::LinkListClear()//清空链表
	{
		if (head == NULL)
		{
			cout << "指针传入为空" << endl;
			return;
		}
		else
		{
			this->len = 0;
			head->next = NULL;
		}
	}
	template<typename T>
	int LinkList<T>::getlen()//返回长度
	{
		if (head == NULL)
		{
			cout << "指针传入为空" << endl;
			return 0;
		}
		else
		{
			return this->len;
		}
	}

	template<typename T>
	int LinkList<T>::insert(int pos, T&t)//指定位置插入节点
	{
		int ret = 0;
		if (head == NULL || pos < 0)
		{
			ret = -1;
			cout << "LinklistInsert err  list == NULL || node == NULL || pos < 0" << endl;
			return ret;
		}

	    node<T>*pcurr = NULL;
		pcurr = head;
		node<T>*node_insert = new node<T>;//开辟空间存储插入的节点 C++模板类 存储空间在底层类中开辟
		node_insert->data = t;//缓存外部数据
		node_insert->next = NULL;//做一个负责人的人避免野指针

		for (int i = 0; i < pos && (pcurr->next != NULL); i++)
		{
			pcurr = pcurr->next;//带头结点的链表,指针指向指定位置的前一个
		}
		node_insert->next = pcurr->next;
		pcurr->next = node_insert;
		this->len++;
		return ret;
	}

	template<typename T>
	int LinkList<T>::getNode(int pos, T&t)//获取指定位置节点
	{
		int ret = 0;
		if (head == NULL || pos < 0)
		{
			ret = -1;
			cout << "getNode err  list == NULL || t == NULL || pos < 0" << endl;
			return ret;
		}

		node<T>*pcurr = NULL;
		pcurr = head;

		for (int i = 0; i < pos && (pcurr->next != NULL); i++)
		{
			pcurr = pcurr->next;//带头结点的链表,指针指向指定位置的前一个
		}
		t = pcurr->next->data;
		return ret;
	}

	template<typename T>
	int LinkList<T>::LinkListDelete(int pos, T&t)//删除指定位置节点
	{
		int ret = 0;
		if (head == NULL || pos < 0)
		{
			ret = -1;
			cout << "LinkListDelete err  list == NULL || t == NULL || pos < 0" << endl;
			return ret;
		}

		node<T> *pcurr = NULL;
		node<T> *tmp = NULL;
		pcurr = head;

		for (int i = 0; i < pos && (pcurr->next != NULL); i++)
		{
			pcurr = pcurr->next;//带头结点的链表,指针指向指定位置的前一个
		}
		tmp = pcurr->next;
		t = tmp->data;
		pcurr->next = tmp->next;
		delete tmp;
		this->len--;
		return ret;
	}





main自定义抽象类Teacher_11测试函数

比较懒测试程序都用的同一个

#define _CRT_SECURE_NO_WARNINGS
#include"dm_11_linklistTemplate.hpp"
#include"iostream"

struct Teacher_11 {
	int age;
	char name[32];
};

void main()
{
	int ret = 0;
	LinkList<Teacher_11>linklist;
	Teacher_11 t1, t2, t3, t4;
	strcpy(t1.name, "zhangsan11");
	strcpy(t2.name, "lisi11");
	strcpy(t3.name, "wangwu11");
	strcpy(t4.name, "maliu11");
	t1.age = 20;
	t2.age = 22;
	t3.age = 24;
	t4.age = 26;
	//建立链表
	linklist.insert(0, t1);
	linklist.insert(0, t2);
	linklist.insert(0, t3);
	linklist.insert(0, t4);

	//遍历
	for (int i = 0; i < linklist.getlen(); i++)
	{
		Teacher_11 tmp;
		linklist.getNode(i, tmp);
		cout << tmp.name << tmp.age << endl;
	}
	//删除
	while (linklist.getlen() > 0)
	{
		Teacher_11 tmp;
		linklist.LinkListDelete(0, tmp);
		cout << tmp.name << '\t' << tmp.age << endl;
	}

	//检验是否删除完毕
	for (int i = 0; i < linklist.getlen(); i++)
	{
		Teacher_11 tmp;
		ret = linklist.getNode(i, tmp);
		if (ret != 0)
		{
			ret = -3;
			cout << "func linklist.getNode( err" << ret << endl;
			return;
		}
		cout << tmp.name << tmp.age << endl;
	}

}

测试结果:

最近特别丧,下午和女票去成都浪几天,希望回来转运,阿弥陀佛么么哒

面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值