编程珠玑: 13章 搜索 13.2使用链表结构,生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结

#include <iostream>
#include <stdio.h>

using namespace std;
/*
问题:使用链表,生成[0 ,maxval]范围内m各随机整数的有序序列
分析:这是典型的插入排序。每次将一个带插入的元素插入到前面已经排好序的结果中。
      1】先查找到待插入位置,2】修改结点指针指向

输入: 
100(元素最大值) 10(输出的元素个数) 
输出; 
输出10个0~100且有序的元素 
*/

typedef struct Node
{
	Node():_next(NULL){}
	Node* _next;
	int _value;
}Node;

int randRange(int min ,int max)  
{  
    if(min > max)  
    {  
        int temp = min;  
        min = max;  
        max = min;  
    }  
    return ( rand() % (max - min + 1) + min );  
}  

template<class T>
class IntSetList
{
public:
	IntSetList(int maxVal)
	{
		_maxVal = maxVal;
		_head = NULL;
		_n = 0;
	}

	void setHead(Node* head)
	{
		_head = head;
		_n = 1;
	}

	~IntSetList()
	{
		deleteList();
	}

	void deleteList()
	{
		Node* node = _head;
		//每个结点先要寻找到下一个指针,再删除
		while(node)
		{
			Node* nextNode = node->_next;
			delete(_head);
			node = nextNode;
		}
	}

	void insert(T value)
	{
		//如果没满,先寻找插入的位置(必须确保不重复),然后修改指针指向
		Node* node = _head;
		Node* previousNode = NULL;
		while(node)
		{
			if(node->_value < value)
			{
				previousNode = node;
				node = node->_next;
			}
			//重复,不插入,直接返回
			else if(node->_value == value)
			{
				return;
			}
			//这里说明找到了不重复的元素,插入
			else
			{
				//如果不是首次插入
				if(previousNode)
				{
					Node* newNode = new Node();
					newNode->_value = value;
					previousNode->_next = newNode;
					newNode->_next = node;
					_n++;
					return;
				}
				//如果是首次插入,需要修改头结点指针
				else
				{
					Node* newNode = new Node();
					newNode->_value = value;
					newNode->_next = _head;
					_head = newNode;
					_n++;
					return;
				}
			}
		}
		//走到这里说明:待插入的元素恰好是在链表尾部,需要插入
		Node* newNode = new Node();
		newNode->_value = value;
		previousNode->_next = newNode;
		_n++;
	}

	int size()
	{
		return _n;
	}
public:
	Node* _head;//头指针
	//int _maxSize;//链表本来就是适用结点数量未知的情形
	int _maxVal;
	int _n;//记录当前有多少个结点
};

void print(IntSetList<int> list)
{
	Node* head = list._head;
	while(head)
	{
		cout << head->_value << " ";
		head = head->_next;
	}
	cout << endl;
}

void process()
{
	int maxVal;
	int maxSize;
	while(cin >> maxVal >> maxSize)
	{
		IntSetList<int> intSetList(maxVal);
		while(intSetList.size() < maxSize)
		{
			int value = randRange(0 , maxVal);
			//非首次插入
			if(intSetList.size() > 0)
			{
				intSetList.insert(value);
			}
			//首次插入,需要建立头结点
			else
			{
				Node* head = new Node();
				head->_value = value;
				intSetList.setHead(head);
			}
		}
		print(intSetList);
	}
}

int main(int argc , char* argv[])
{
	process();
	getchar();
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值