直接上代码,详见代码中注释:
/* * list.h * * Created on: * Author: wdmcel */ #ifndef _LIST_H_ #define _LIST_H_ #include <string.h> #include <iostream> using namespace std; class test_t //定义了一个用于测试模板特化的类 { public: test_t(int x_ = 0, int y_ = 0) //构造函数,由于形参提供了默认值,无须重载test_t() { m_x = x_; m_y = y_; } ~ test_t() { } test_t (const test_t& test_) //复制构造函数,形参必须为引用,否则会递归调用至栈溢出 { m_x = test_.m_x; m_y = test_.m_y; } test_t& operator=(const test_t& test_) //重载赋值运算符,返回引用合保证能够连用“=” { m_x = test_.m_x; m_y = test_.m_y; return *this; } int get_x() { return m_x; } int get_y() { return m_y; } private: //含两个成员变量 int m_x; int m_y; }; template <typename T> //定义模板类,包含一个数据成员data,及一个指向该类实例的指针 struct node_t { node_t(T data_) : next(NULL) { data = data_; } T data; node_t* next; }; template <> struct node_t<char*> //模板参数特化,char*不能如同普通类型数据一样处理,因此需要特化 { node_t(char* data_ = NULL) : next(NULL) { data = new char[strlen(data_) + 1]; if (NULL != data) { memcpy(data, data_, strlen(data_)); data[strlen(data_)] = '\0'; } } //第100行删除节点的时候,已经delete了 ~node_t() { if (NULL != data) { delete data; data = NULL; } } char* data; node_t* next; }; template <> struct node_t<test_t> //对test_t类进行特化 { node_t(const test_t& test_) : next(NULL) { data = test_; } test_t data; node_t *next; }; template <typename C> class list_t //实现list类 { public: list_t(C data_): m_mount(0) { m_list = new node_t<C>(data_); } ~list_t() { if (NULL != m_list) { delete m_list; m_list = NULL; } } int get_mount() { return m_mount; } node_t<C>* get_list() { return m_list; } void insert_list(C& data_) { node_t<C> *tmp; tmp = new node_t<C>(data_); tmp->data = data_; tmp->next = m_list->next; m_list->next = tmp; m_mount++; } node_t<C> * delete_list(node_t<C> * node_) { //cout << "delete data : " << node_->data << endl; m_list->next = node_->next; delete node_; node_ = m_list->next; m_mount--; return node_; } void show_list() { node_t<C> *tmp; tmp = m_list->next; while (NULL != tmp) { cout << tmp->data << endl; tmp = tmp->next; } } private: int m_mount; node_t<C> * m_list; }; #endif /* LIST_H_ */测试代码:
#include "list.h" int main() { /* list_t<double> list(1.0); double data_double = 1.234; for (int i = 0; i <= 10; i++) { list.insert_list(data_double); } node_t<double> *tmp; tmp = list.get_list() -> next; while (NULL != (tmp = list.delete_list(tmp))) { } */ /* list_t<string> list(""); string data_string("wdmcel"); for (int i = 0; i <= 10; i++) { list.insert_list(data_string); } node_t<string> *tmp; tmp = list.get_list() -> next; while (NULL != (tmp = list.delete_list(tmp))) { } */ /* list_t<char*> list(""); char* data_pchar = ("wdmyong"); for (int i = 0; i <= 10; i++) { list.insert_list(data_pchar); } node_t<char*> *tmp; tmp = list.get_list() -> next; while (NULL != (tmp = list.delete_list(tmp))) { } */ test_t data_class(2,4); list_t<test_t> list(data_class); for (int i = 0; i <= 10; i++) { list.insert_list(data_class); } node_t<test_t> *tmp; tmp = list.get_list() -> next; while (NULL != (tmp = list.delete_list(tmp))) { //cout << tmp->data.get_x() << endl; } system("pause"); return 0; }双向链表下次奉上~