箱子排序---设计链表类完成箱子排序

链表类

class ChainNode
{
public:
	//元素
	int element;
	//下一个节点
	ChainNode* next;
	//空构造函数
	ChainNode() {}
	//包含元素的构造
	ChainNode(const int& element)
	{
		this->element = element;
	}
	ChainNode(const int& element, ChainNode* next)
	{
		this->element = element;
		this->next = next;
	}
};
//包装链表类的Chain类
class Chain
{
protected:
	ChainNode* firstNode;
	int listSize;
	bool checkIndex(int index) const
	{
		return (index < 0 || index > listSize);
	}
public:
	Chain(int capacity = 10)
	{
		if (capacity < 1)
		{
			cout << "the capacity your input is to slow" << endl;
			return;
		}
		firstNode = NULL;
		listSize = 0;
	}
	Chain(const Chain& c)
	{
		listSize = c.listSize;
		if (listSize == 0)
		{
			firstNode = NULL;
			return;
		}
		ChainNode* sourceNode = c.firstNode;
		firstNode = new ChainNode(sourceNode->element);
	}
	~Chain()
	{
		//逐个删除
		while (firstNode != NULL)
		{
			ChainNode* next = firstNode->next;
			delete firstNode;
			firstNode = next;
		}
	}
	bool empty()
	{
		return (listSize == 0);
	}
	int size()
	{
		return listSize;
	}
	int get(int index)
	{
		if (checkIndex(index))
		{
			cout << "the index you input is wrong" << endl;
			//这里正常要抛出异常,省略了
			return -11111111111;
		}
		ChainNode* current = firstNode;
		for (int i = 0; i < index; i++)
		{
			current = current->next;
		}
		return current->element;
	}
	int indexOf(const int element) const
	{
		ChainNode* current = firstNode;
		for (int index = 0; index < listSize && current != NULL; index++)
		{
			if (current->element == element)
			{
				return index;
			}
			current = current->next;
		}
		return -1;
	}
	void erase(int index)
	{
		if (checkIndex(index))
		{
			cout << "the index you input is wrong" << endl;
			return;
		}
		ChainNode* deleteNode = firstNode;
		//如果移除的是头节点
		if (index == 0)
		{
			firstNode = firstNode->next;
		}
		else
		{
			ChainNode* current = firstNode;
			//index - 1即为索引为index的前驱节点
			for (int i = 0; i < index - 1; i++)
			{
				current = current->next;
			}
			//将要删除的元素赋值给deleteNode
			deleteNode = current->next;
			current->next = current->next->next;
		}
		listSize--;
		delete deleteNode;
	}
	void insert(int index, const int element)
	{
		if (checkIndex(index))
		{
			cout << "the index you input is wrong" << endl;
			return;
		}
		ChainNode* current = firstNode;
		if (index == 0)
		{
			firstNode = new ChainNode(element, firstNode);
		}
		else
		{
			for (int i = 0; i < index - 1; i++)
			{
				current = current->next;
			}
			current->next = new ChainNode(element, current->next);
		}
		listSize++;
	}
	//将单链表反转
	void reverse()
	{
		int length = listSize;
		for (int index = 0; index < listSize - 1; index++)
		{
			int headEle = this->get(0);
			this->insert(length--, headEle);
			this->erase(0);
		}
	}
	friend ostream& operator << (ostream& cout, Chain& c);
};
ostream& operator << (ostream& cout, Chain& c)
{
	ChainNode* current = c.firstNode;
	while (current != NULL)
	{
		cout << current->element << " ";
		current = current->next;
	}
	return cout;
}

完整代码

要排序的数的范围和个数由用户输入

#include<iostream>
#include<ctime>
using namespace std;
//链表类
class ChainNode
{
public:
	//元素
	int element;
	//下一个节点
	ChainNode* next;
	//空构造函数
	ChainNode() {}
	//包含元素的构造
	ChainNode(const int& element)
	{
		this->element = element;
	}
	ChainNode(const int& element, ChainNode* next)
	{
		this->element = element;
		this->next = next;
	}
};
//包装链表类的Chain类
class Chain
{
protected:
	ChainNode* firstNode;
	int listSize;
	bool checkIndex(int index) const
	{
		return (index < 0 || index > listSize);
	}
public:
	Chain(int capacity = 10)
	{
		if (capacity < 1)
		{
			cout << "the capacity your input is to slow" << endl;
			return;
		}
		firstNode = NULL;
		listSize = 0;
	}
	Chain(const Chain& c)
	{
		listSize = c.listSize;
		if (listSize == 0)
		{
			firstNode = NULL;
			return;
		}
		ChainNode* sourceNode = c.firstNode;
		firstNode = new ChainNode(sourceNode->element);
	}
	~Chain()
	{
		//逐个删除
		while (firstNode != NULL)
		{
			ChainNode* next = firstNode->next;
			delete firstNode;
			firstNode = next;
		}
	}
	bool empty()
	{
		return (listSize == 0);
	}
	int size()
	{
		return listSize;
	}
	int get(int index)
	{
		if (checkIndex(index))
		{
			cout << "the index you input is wrong" << endl;
			return -11111111111;
		}
		ChainNode* current = firstNode;
		for (int i = 0; i < index; i++)
		{
			current = current->next;
		}
		return current->element;
	}
	int indexOf(const int element) const
	{
		ChainNode* current = firstNode;
		for (int index = 0; index < listSize && current != NULL; index++)
		{
			if (current->element == element)
			{
				return index;
			}
			current = current->next;
		}
		return -1;
	}
	void erase(int index)
	{
		if (checkIndex(index))
		{
			cout << "the index you input is wrong" << endl;
			return;
		}
		ChainNode* deleteNode = firstNode;
		//如果移除的是头节点
		if (index == 0)
		{
			firstNode = firstNode->next;
		}
		else
		{
			ChainNode* current = firstNode;
			//index - 1即为索引为index的前驱节点
			for (int i = 0; i < index - 1; i++)
			{
				current = current->next;
			}
			//将要删除的元素赋值给deleteNode
			deleteNode = current->next;
			current->next = current->next->next;
		}
		listSize--;
		delete deleteNode;
	}
	void insert(int index, const int element)
	{
		if (checkIndex(index))
		{
			cout << "the index you input is wrong" << endl;
			return;
		}
		ChainNode* current = firstNode;
		if (index == 0)
		{
			firstNode = new ChainNode(element, firstNode);
		}
		else
		{
			for (int i = 0; i < index - 1; i++)
			{
				current = current->next;
			}
			current->next = new ChainNode(element, current->next);
		}
		listSize++;
	}
	//将单链表反转
	void reverse()
	{
		int length = listSize;
		for (int index = 0; index < listSize - 1; index++)
		{
			int headEle = this->get(0);
			this->insert(length--, headEle);
			this->erase(0);
		}
	}
	friend ostream& operator << (ostream& cout, Chain& c);
};
ostream& operator << (ostream& cout, Chain& c)
{
	ChainNode* current = c.firstNode;
	while (current != NULL)
	{
		cout << current->element << " ";
		current = current->next;
	}
	return cout;
}
int main()
{
	//用户手动输入要排序数据的总数
	int n = 0;
	cout << "请输入要排序的数的个数" << endl;
	cin >> n;
	//用户输入数的范围
	cout << "请输入参与排序的数的最大值" << endl;
	int max = 0;
	cin >> max;
	//随机数种子
	srand((unsigned)time(NULL));
	//准备初始链表
	Chain c(n);
	//随机产生n个0-max的随机数,并插入链表中
	for (int index = 0; index < n; index++)
	{
		int temp = rand() % (max + 1);
		c.insert(0, temp);
	}
	//创建箱子
	Chain* box = new Chain[max + 1];
	//将链表c中的元素插入box中
	//链表c采用头删除,box[index]链表采用头插入
	//循环n次
	for (int index = 0; index < n; index++)
	{
		//获取第一个元素
		int temp = c.get(0);
		//删除第一个元素
		c.erase(0);
		//放入对应的箱子当中
		box[temp].insert(0, temp);
	}
	//初始化保存排序后的链表
	Chain sorted;
	//将箱子中的元素取出,删除,并插入新的链表中
	for (int index = max; index >= 0; index--)
	{
		//先获取箱子的长度,由于箱子在删除元素的时候长度在不断减小
		//这时候要先获取长度才行
		int size = box[index].size();
		//从箱子中取元素并删除
		for (int i = 0; i < size; i++)
		{
			int temp = box[index].get(0);
			box[index].erase(0);
			sorted.insert(0, temp);
		}
	}
	//输出新的链表
	cout << sorted << endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值