设计一个c++ 通用链表:实现多态双向的功能

互联网 18-7-24
之前用c实现的通用链表, 将链表的data域从具体类型转变为 void*指针 ,用c实现时费力气的是指针的赋值和也要做到通用的打印

链接:c实现的通用的双向链表现在用c++重新实现,思想大都一致:

不采用模板类,而采用虚函数实现多态性,达到通用的目的,data域不存储任何跟类型有关的信息,而是指针,将数据放于抽象类中,由指针与之建立联系。

链表有头指针 尾指针,以及之后的一系列插入删除打印操作,这些函数都写在链表类中。

链表指针类型为 链表结点类,结点的指针域和 data域,都是指针类型,data域 指向一个抽象类 object对象 。

object类是一个抽象类,当需要链表存放整型数据,就具体实现一个存放整型的子类去继承这个类,必须实现抽象类中的虚函数,以打印函数为例, 每一个不同数据类型的子类都得有自己的打印函数,而object 不关心如何打印。

class intobject :public Object { public: 	intobject(int d = 0) :data(d) 	{} 	~intobject() 	{} 	void Print()const 	{ 		cout << data << "-->"; 	} private: 	int data; }; //////////////////////////////////////////////////////////// class strobject :public Object { public: 	strobject(char *str)  	{ 		if (str == NULL) 		{ 			data = new char[1]; 			data[0] = '\0'; 		} 		else 		{ 			data = new char[strlen(str) + 1]; 			strcpy(data, str); 		} 	} 	~strobject() 	{} 	void Print()const 	{ 		cout << "\"" << data << "\"" << "-->"; 	} private: 	char * data; };  //////////////////////////////////////////////////////////// class floatobject :public Object { public: 	floatobject(float d = 0) :data(d) 	{} 	~floatobject() 	{} 	void Print()const 	{ 		cout << data << "-->"; 	} private: 	float data; }; ////////////////////////////////////////////////////////////  void main() { 	list mylist; 	for (int i = 0; i < 5; ++i) 	{ 		intobject *pi = new intobject(i); 		mylist.push_back(pi); 	} 	mylist.printlist();  	char* arr[5] = { "affd", "fdas", "fdfss", "ere", "qret" }; 	for (int i = 0; i < 5; i++) 	{ 		strobject*ps = new strobject(arr[i]); 		mylist.push_back(ps); 	} 	mylist.printlist();  	float brr[5] = { 0.34, 54.32, 0.53, 43.2, 5.878 }; 	for (int i = 0; i < 5; i++) 	{ 		floatobject*ps = new floatobject(brr[i]); 		mylist.push_back(ps); 	} 	mylist.printlist(); }

链表的释放:

class Object { public: 	Object() 	{} 	virtual ~Object()//因为是虚函数,调动父类析构的 同时 调动子类的析构 	{} 	////定义接口   通用的打印 	virtual void Print()const = 0;//纯虚函数  子类继承了之后必须实现打印函数 }; class list;  class listnode { 	friend class list; public: 	listnode() 	{ 		data = NULL; 		next = NULL; 	} 	listnode(Object *pobj) 	{ 		data = pobj; 		next = NULL; 	} 	~listnode() 	{ 		delete data; 		next = NULL; 	}  private: 	Object *data; 	listnode *next; };  class list { public: 	list() 	{ 		head = tail = new listnode; 	} 	~list() 	{ 		listnode *delp = head->next; 		while (delp!= tail) 		{ 			head->next = delp->next; 			delete delp; 			delp = head->next; 		} 		delete head; 		head = tail = NULL; 	} 	void push_back(Object *pb)//尾插 	{ 		listnode *s = new listnode(pb); 		assert(s != NULL); 		tail->next = s; 		tail = s;		 	} 	void printlist()const 	{ 		listnode *p = head->next; 		while (p != NULL) 		{ 			p->data->Print(); 			p = p->next; 		} 		cout << "NULL" << endl; 	} private: 	listnode *head; 	listnode *tail; };   //////////////////////////////////////////////////////////// class intobject :public Object { public: 	intobject(int d = 0) :data(d) 	{} 	~intobject() 	{ 		cout << "delete int" << endl; 	} 	void Print()const 	{ 		cout << data << "-->"; 	} private: 	int data; }; //////////////////////////////////////////////////////////// class strobject :public Object { public: 	strobject(char *str)  	{ 		if (str == NULL) 		{ 			data = new char[1]; 			data[0] = '\0'; 		} 		else 		{ 			data = new char[strlen(str) + 1]; 			strcpy(data, str); 		} 	} 	~strobject() 	{ 		cout << "delete string" << endl; 		delete []data; 		data = NULL; 	} 	void Print()const 	{ 		cout << "\"" << data << "\"" << "-->"; 	} private: 	char * data; };

相关推荐:

C语言使用utlist实现的双向链表

Java语言中链表和双向链表_MySQL

以上就是设计一个c++ 通用链表:实现多态双向的功能的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: c++ 通用链表
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:C++实现贪吃蛇游戏的详细步骤及实战演示

相关资讯