首页后端开发ASP.NET设计一个c++ 通用链表:实现多态双向的功能

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

时间2024-01-30 22:39:02发布访客分类ASP.NET浏览172
导读:收集整理的这篇文章主要介绍了设计一个c++ 通用链表:实现多态双向的功能,觉得挺不错的,现在分享给大家,也给大家做个参考。之前用c实现的通用链表, 将链表的data域从具体类型转变为 void*指针 ,用c实现时费力气的是指针的赋值和也要...
收集整理的这篇文章主要介绍了设计一个c++ 通用链表:实现多态双向的功能,觉得挺不错的,现在分享给大家,也给大家做个参考。之前用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++ 通用链表:实现多态双向的功能的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: C#/基于Unity 行为树的实现步骤【...下一篇:C++实现贪吃蛇游戏的详细步骤及实...猜你在找的ASP.NET相关文章 C# 一些面试试题的实例教程2022-05-16.NET 6开发TodoList应用之请求日志组件HttpLogging介绍2022-04-16.NET 6中间件Http Logging使用介绍2022-04-16gojs一些实用的高级用法2022-04-16.NET6开发TodoList应用之实现查询排序2022-04-16.NET6开发TodoList应用之实现数据塑形2022-04-16.NET微服务架构CI/CD自动打包镜像2022-04-16Asp.Net Core 使用Monaco Editor 实现代码编辑器功能2022-04-16.NET微服务架构CI/CD自动构建Jenkins+Gitee2022-04-16.Net Core微服务网关Ocelot集成Consul2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: 设计一个c++ 通用链表:实现多态双向的功能
本文地址: https://pptw.com/jishu/593131.html
怎么用JavaScript判断是不是回文数 C/C++区别有哪些?很多人都不知道的比较方法

游客 回复需填写必要信息