类模板实例(1)

版权声明:本文为博主原创文章,欢迎分享!吾生有涯而知也无涯,一起加油 https://blog.csdn.net/qq_41822235/article/details/82558614

类模板中的要点:

类内成员方法也是可以有模板的;也会涉及到成员方法的模板以及成员方法模板的特例化

优先级是  成员方法 > 模板的特例化  > 模板在任何情况下都是如此!)

#include<iostream>
using namespace std;

template<typename T>
class LinkedList {
public:
	class LinkedNode {
	public:
		T _val;
		LinkedNode *_next;
		LinkedNode(T value = T()) {
			_val = value;
			_next = NULL;
		}	//构造方法
	};
	LinkedList();	//构造函数
	~LinkedList();	//析构函数
	void headInsert(T value);	//头部插入
	void show();	//打印输出
	bool delNode(T value);	//删除某个节点
	LinkedNode *queryNode(T value);		//成员方法  查找是否包含某个节点
	//优先级顺序为  成员方法 > 模板特例化  > 模板
	/*成员方法也是函数,故而可以抽象成模板,类模板的成员方法的特例化不能在类外实现,否则会产生语法错误*/
	
	template<typename E>
	LinkedNode *queryNode(E value);
	template<>
	LinkedNode *queryNode<char *>(char *value) 
	{
		cout << "LinkedList *queryNode<char *>(char *value)" << endl;
		LinkedNode *p = _head->_next;
		while (!p)
		{
			if (strcmp(value, p->_val)) return p;
			p = p->_next;
		}
		return NULL;
	}
private:
	LinkedNode *_head;
};

//实现构造方法
template <typename T>
LinkedList<T>::LinkedList(){	
	_head = new LinkedNode();
}

//实现析构方法
template<typename T>
LinkedList<T>::~LinkedList() {		
	LinkedNode *p = _head;	//从头节点开始一步到位
	while (p != NULL) {
		p = _head->_next;	//p后移
		delete _head;
		_head = p;
	}
}

//实现头部插入
template<typename T>
void LinkedList<T>::headInsert(T value) {	
	LinkedNode *p = new LinkedNode(value);
	p->_next = _head->_next;
	_head->_next = p;
}

//实现打印输出
template<typename T>
void LinkedList<T>::show() {		
	LinkedNode *p = _head->_next;
	while (p != NULL) {
		cout << p->_val << "  ";
		p = p->_next;
	}
	cout << endl;
}

//实现删除
template<typename T>
bool LinkedList<T>::delNode(T value) {		
	LinkedNode *p = _head;
	while (p->_next != NULL) {
		if (value == p->_next->_val) {
			LinkedNode *q = p->_next;
			p->_next = q->_next;	//p的后继变成待删除节点的后继
			delete q;
			return true;
		}
		p = p->_next;
	}
	return false;
}

//成员方法查找是否包含某个特定值的节点
template<typename T>	
typename LinkedList<T>::LinkedNode * LinkedList<T>::queryNode(T value) 
{
	cout << "LinkedNode *queryNode(T value)" << typeid(value).name() << endl;
	LinkedNode *p = _head->_next;
	while (p != NULL) {
		if (value == p->_val) return p;
		p = p->_next;
	}
	return NULL;
}

//成员方法查找是否包含某个特定值的节点的模板
template<typename T>
template<typename E>
typename LinkedList<T>::LinkedNode *LinkedList<T>::queryNode(E value) {
	cout << "LinkedList<T>::LinkedNode *LinkedList<T>::queryNode(E value)" << typeid(value).name() << endl;
	LinkedNode *p = _head->_next;
	while (p != NULL) {
		if (value == p->_value) return p;
		p = p->_next;
	}
	return NULL;
}

/*测试用例*/
int main() {
	LinkedList<int> list;
	for (int i = 0; i < 10; ++i)
		list.headInsert(i);
	list.show();
	list.delNode(5);
	list.show();
	LinkedList<int>::LinkedNode *p = list.queryNode(1);
	if (NULL != p)
		cout << p->_val << "  " << endl;
	system("pause");
	return 0;
}
图1  运行结果

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/82558614