Home  >  Article  >  Backend Development  >  Design a C++ universal linked list: realize polymorphic two-way function

Design a C++ universal linked list: realize polymorphic two-way function

php是最好的语言
php是最好的语言Original
2018-07-24 17:58:512132browse

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

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

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

Design a C++ universal linked list: realize polymorphic two-way function

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

链表指针类型为 链表结点类,结点的指针域和 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] = &#39;\0&#39;;
		}
		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();
}

Design a C++ universal linked list: realize polymorphic two-way function

 链表的释放:

Design a C++ universal linked list: realize polymorphic two-way function

 

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] = &#39;\0&#39;;
		}
		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

The above is the detailed content of Design a C++ universal linked list: realize polymorphic two-way function. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn