C++模板类实现链表

注意

  1. 链表中要包含Node的结构体,用来把节点放进去
  2. 只有出现Node就要加<T> ,不然会报错
  3. 有类模板的重新编译记得清空再重新生成
  4. 清除链表时使用的循环清空头结点的思想需要记得(C语言中一样循环调用清除0号元素也可以)
  5. Debug和Release编译不同,一步一步执行时顺序不一样,不知道为啥了,不过不重要,结果一样

自己写的清空函数

template <typename T>
void Link<T>::clear()
{
	//先把原来的内存都删除掉
	Node<T>* tmp = NULL;
	tmp = head;
	while (head->next != NULL)
	{
		del(0);
	}
}

原本的清除函数

template <typename T>
void Link<T>::clear()
{
	//先把原来的内存都删除掉
	Node<T>* tmp = NULL;
	tmp = head;
	while (head != NULL)
	{
		tmp = head->next;//临时缓存后面的变量
		delete head;//释放当前变量
		head = tmp;//指向后面的变量

	}
	//创建新的头结点
	head = new Node<T>;
	head->next = NULL;
	len = 0;
}

需要增加的新节点(与线性表不同的地方)

template <typename T>
struct Node
{
	T t;
	Node<T>* next;//注意这里的node也要加上<T>
};

头文件

template <typename T>
class Link
{
public:
	Link();


	~Link();

	int getlen();


	int insert(const T& t, int pos);

	T del(int pos);

	T get(int pop);

	void clear();


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

构造函数

template <typename T>
Link<T>::Link()
{
		head = new Node<T>;//!!!注意Node永远和<T>在一起
		//memset(head, 0, sizeof(T));//注意不要用memset 涉及到Teacher 把下一个指针置空就可以
		head->next = NULL;
		len = 0;
}

析构函数


template <typename T>
Link<T>::~Link()
{
	Node<T>* tmp = NULL;//模板记得加
	tmp = head;
	while (head!=NULL)
	{
		tmp = head->next;//临时缓存后面的变量
		delete head;//释放当前变量
		head = tmp;//指向后面的变量

		//想法 删掉头结点 使下一个节点变成头结点 但是不行 所以引入辅助变量 把head的next缓存下来
		//delete head
		//head = head->next;

	}
	len = 0;
	head = NULL;
}

插入删除和读取

template <typename T>
int Link<T>::insert(const T& t1, int pos)
{
	Node<T> *node=new Node<T>;//注意这里的new后面也要<T>
	node->t = t1;
	Node<T>* current = NULL;
	current = head;

	if (pos < 0||node==NULL)
	{
		cout << "error in insert" << endl;
		return -1;
	}
	if (pos > len)
	{
		pos = len;
	}
	for (int i = 0;i < pos;i++)
	{
		current = current->next;
	}
	//新节点先连接
	node->next = current->next;
	current->next = node;

	len++;//记得加长度
	return 0;

}

template <typename T>
T Link<T>::del(int pos)
{

	Node<T>* current = NULL;
	current = head;

	if (pos < 0 )
	{
		cout << "error in del" << endl;

	}
	if (pos >= len)
	{
		pos = len-1;
	}
	for (int i = 0;i < pos;i++)
	{
		current = current->next;
	}

	Node<T>* node = NULL;
	node = current->next;
	T tmp = node->t;
	current->next = node->next;
	//删掉node的内存
	delete node;
	len--;//长度减1
	return tmp;
}

template <typename T>
T Link<T>::get(int pos)
{
	Node<T>* current = NULL;
	current = head;

	if (pos < 0 )
	{
		cout << "error in get" << endl;

	}
	if (pos >= len)
	{
		pos = len - 1;
	}
	for (int i = 0;i < pos;i++)
	{
		current = current->next;
	}
	current = current->next;
	return current->t;
}

最后是测试CPP

	Teacher t1, t2, t3;
	t1.age = 31;
	strcpy(t1.name, "t1t1t1");
	strcpy(t1.worknum, "num1");
	t2.age = 32;
	strcpy(t2.name, "t2t2t2");
	strcpy(t2.worknum, "num2");
	t3.age = 33;
	strcpy(t3.name, "t3t3t3");
	strcpy(t3.worknum, "num3");

	Link<Teacher> link;//类模板的参数 记得<>


	link.insert(t2, 0);
	link.insert(t1, 0);
	link.insert(t3, 2);

	cout << link.getlen() << endl;

	Teacher tmp;

	for (int i = 0;i < link.getlen();i++)
	{
		tmp = link.get(i);
		cout << tmp.name << endl;
	}

	tmp = link.del(1);
	cout << tmp.name << endl;

	link.clear();
面向对象程序设计课程作业 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值