类模板的实例(2)

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

类模板的实例(1)

#include<iostream>
using namespace std;

template<typename T>
class LinkedList {
public:
	//嵌套类
	class LinkedNode {
	public:
		T _val;
		LinkedNode *_next;
	};

	LinkedList();		//构造方法
	~LinkedList();	//析构方法
	void headInsert(T value);	//头部插入
	void show();	//打印输出
	/*先查找再删除,让删除函数调用查找函数*/
	bool delNode(T value);	//删除节点
	LinkedNode *queryNode(T value);	//查找节点
private:
	LinkedNode *_head;
};

//template <>表示对函数模板进行特例化
template<>
class LinkedList<char *> {
public:
	//嵌套类
	class LinkedNode {		//链表节点类
	public:
		LinkedNode(char *value = char()) { _val = value; _next = NULL; };
		char * _val;
		LinkedNode *_next;
	};

	LinkedList();		//构造方法
	~LinkedList();	//析构方法
	void headInsert(char* value);	//头部插入
	void show();	//打印输出

	/*先查找再删除,让删除函数调用查找函数,提高代码的复用性*/
	bool delNode(char* value);	//删除节点
	LinkedNode *queryNode(char* value);	//查找节点
private:
	
	LinkedNode *_head;
};

/**********************************************************************************/
LinkedList<char*>::LinkedList()		//特例化的链表类进行初始化
{
	_head = new LinkedNode;
}

/**********************************************************************************/
LinkedList<char*>::~LinkedList()	//特例化的链表类进行析构
{
	LinkedNode *p = _head;
	while (p != NULL) {
		p = p->_next;		//p指针后移
		delete _head;
		_head = p;
	}
}
/**********************************************************************************/
void LinkedList<char*>::headInsert(char * value)	//特例化的链表类进行头部插入
{
	LinkedNode *p = new LinkedNode(value);
	p->_next = _head->_next;
	_head->_next = p;
}

/**********************************************************************************/
void LinkedList<char*>::show()		//打印输出特例化的链表类;因为是头部插入,所以具有后来局前的特点
{
	LinkedNode *p = _head->_next;
	if (NULL != p)
		cout << "头插法构造的单链表为:";
	while (NULL != p) {
		cout << p->_val << "  ";
		p = p->_next;
	}
	cout << endl;
}

/**********************************************************************************/
bool LinkedList<char*>::delNode(char * value)	//删除特例化的链表类的特定节点
{
	LinkedNode *p = _head;
	LinkedNode *q;
	while (p->_next != NULL) {
		q = queryNode(value);		//进行查找   如果找到:p是待删除节点的前驱;q是待删除节点 
		if (q != NULL) {
			p->_next = q->_next;	//p的后继变成q的后继;跳过q本身
			delete q;
			return true;
		}
		p = p->_next;		//p指针后移,待进行下一次查找
	}
	return false;
}

/**********************************************************************************/
LinkedList<char*>::LinkedNode * LinkedList<char*>::queryNode(char * value)	//查找特例化的链表类的特定节点
{
	LinkedNode *p = _head->_next;
	while (p != NULL) {
		if (0 == strcmp(p->_val, value))
			return p;
		p = p->_next;		//p指针后移,待进行下一次查找
	}
	return NULL;
}

/******************************测试用例************************************************/
int main() {
	LinkedList<char*>list;
	char str1[] = { "aaaaaaaaa" };
	char str2[] = { "bbbbbbbbbbbb" };
	char str3[] = { "cccccccccc" };
	
	
	//测试头插函数是否正确
	list.headInsert(str1);
	list.headInsert(str2);

	//测试打印输出函数是否正确
	list.show();

	//测试查找函数是否正确
	LinkedList<char*>::LinkedNode* p = list.queryNode(str3);
	if (p != NULL)
		cout << "找到 " <<str3<< endl;
	else
		cout << "没找见 " <<str3<< endl;
	

	//测试删除函数是否正确
	bool flag = list.delNode(str3);
	cout << "想要删除值为" << str3 <<" 的节点"<< endl;
	if (flag)
		cout << "删除  " <<str3<<"成功 "<<endl;
	else
		cout << "并不包含  "<<str3<<"故而删除失败" << endl;
	list.show();

	//说明,构造函数和析构函数无需测试,因为运行无误的话,就证明了其正确性,测试用例的结果显示正常,暂时没有问题。
	system("pause");		//解决黑窗口一闪而过的问题,暂时没有什么其他好办法
	return 0;
}
图1  运行结果

猜你喜欢

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