多态实现通用链表

链表节点的数据域类型不再为具体的数据类型,而是通过一个基类指针引入,达到不借助模板而是通过多态实现通用链表

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

class Object
{
public:
	Object(){}
	virtual ~Object(){}
	virtual void Print()const = 0;
	virtual bool Compare(Object *pObj) = 0;
};

class List;
class ListNode
{
	friend class List;
public:
	ListNode()
	{
		data = NULL;
		next = NULL;
	}
	ListNode(Object *pObj)
	{
		data = pObj;
		next = NULL;
	}

	~ListNode()
	{
		delete data;
		data = NULL;
	}
private:
	Object *data;
	ListNode *next;

};

class List
{
public:
	List()
	{
		head = last = new ListNode;
	}
	bool PushBack(Object *pObj)
	{
		ListNode *s = new ListNode(pObj);
		if (s == NULL)
			return false;

		last->next = s;
		last = s;
		return true;
	}
	void Print()const
	{
		ListNode *p = head->next;
		while (p != NULL)
		{
			p->data->Print();
			p = p->next;
		}
		cout << ".Nul" << endl;
	}
	void InsertOrder(Object* pObj)
	{
		ListNode *s = new ListNode(pObj);
		ListNode *q = head;
		ListNode *p = head->next; // q-->p
		while (p != NULL && p->data->Compare(s->data))
		{
			q = p;
			p = p->next;
		}
		s->next = p;
		q->next = s;
		if (p == NULL)
			last = s;
	}

	~List()
	{
		ListNode *p = head->next;
		while (p != NULL)
		{
			head->next = p ->next;
			delete p;
			p = head->next;
		}
		delete head;
		head = last = NULL;
	}
private:
	ListNode *head;
	ListNode *last;
};

class IntObject : public Object
{
public:
	IntObject(int d = 0):data(d){}
	~IntObject(){}
	void Print()const
	{
		cout << data << "-->";
	}
	bool Compare(Object *pObj)
	{
		IntObject *pInt = dynamic_cast<IntObject*>(pObj);
		if (pInt != NULL)
		{
			return data < pInt->data;
		}
		return false;
	}
private:
	int data;
};

class StrObject :public Object
{
public:
	StrObject(const char* str)
	{
		if (str == NULL)
		{
			data = new char[1];
			data[0] = '\0';
		}
		else
		{
			data = new char[strlen(str) + 1];
			strcpy(data, str);
		}
	}

	void Print()const
	{
		cout << "\"" << data << "\"" << "-->";
	}

	bool Compare(Object *pObj)
	{
		StrObject *pStr = dynamic_cast<StrObject*>(pObj);
		if (pStr != NULL)
		{
			return strcmp(data, pStr->data) < 0;
		}
		return false;
	}

	StrObject()
	{
		delete[] data;
		data = NULL;
	}
private:
	char *data;
};

int main()
{
	List intList;
	List strList;
	for (int i = 0; i <= 10; i++)
	{
		IntObject *pInt = new IntObject(i);
		intList.PushBack(pInt);
	}
	intList.Print();

	const char *str[] = {"hello", "c++", "you", "are", "simple" };
	for (int i = 0; i < 5; i++)
	{
		StrObject *pStr = new StrObject(str[i]);
		strList.PushBack(pStr);
	}
	strList.Print();

	List orderList;
	const char *str1[] = { "hello", "c++", "you", "are", "simple" };
	for (int i = 0; i < 5; i++)
	{
		StrObject *pStr = new StrObject(str1[i]);
		orderList.InsertOrder(pStr);
	}
	orderList.Print();


	system("pause");
	return 0;
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值