<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Container</title>
</head>

<body>

<div align="center">
  <center>
  <pre><font size="6" color="#FF0000"><b>Partition Generator</b></font></pre>
  </center>
</div>

<div align="left">
  <pre><b><font color="#FF0000" size="5">A.第<span lang="zh-cn">三</span>版</font></b></pre>
</div>
<div align="left">
  <pre><b>这个小程序<span lang="zh-cn">应该</span>是<span lang="zh-cn">动态数组的第三个</span>版本<span lang="zh-cn">吧，或者说他的应用吧？并且我觉得更应该归类为<a href="Generator.htm">发生器</a>的序列</span>。<span lang="zh-cn">对模板类作了三个子类，分别是</span></b><span lang="zh-cn"><b>整数子类</b></span></pre>
</div>
<div align="left">
  <pre><span lang="zh-cn"><b>IntList和整数子类的指针所组成的子类PtrList，以及整数指针的指针所组成的子类NodeList。</b></span></pre>
</div>
<div align="left">
  <pre><span lang="zh-cn"><b>并写了一个Partition的发生器类，里面有一个NodeList对象，他的每一个元素PtrList就是一个partition,而若干个整数如果出于同一组的话，</b></span></pre>
</div>
<div align="left">
  <pre><span lang="zh-cn"><b>那么就存在同一个IntList里。</b></span></pre>
</div>
<div align="left">
  <pre><b>1。 程序基本说明：当mylist加入的是指针的话，<a href="Container.htm">你自然不想让他排序</a>，不然地址排序会变得乱七八糟，所以，我把add函数改了一下，加了一个</b></pre>
</div>
<div align="left">
  <pre><b>	是否排序的参数。同样，find函数也必须加这个参数。结果就是直接在最后一个位置加这个元素进数组。</b></pre>
</div>
<div align="left">
  <pre><b>   	关于partition的发生原理，其实，在我的在我的partition<a href="emptySet.htm#formulae">数量递归公式里</a>就体现出了。一个新元素x加入到原来的n-1的集合里，假定</b></pre>
</div>
<div align="left">
  <pre><b>	原来的集合有f(n-1)个partitions, x或者以一个独立的subset形式与f(n-1)个partition进行union组成的每一个集合就是新的n个</b></pre>
</div>
<div align="left">
  <pre><b>	元素的集合的新的partitions。或者x与每一个f(n-1)的partition的每一个subset结合成新的subset，然后这个partition也成为</b></pre>
</div>
<div align="left">
  <pre><b>	一个新的partition。如：3个元素的partition有（a，b，c），（ab，c），(ac,b),(bc,a), (abc)；那么新加一个元素d,首先，</b></pre>
</div>
<div align="left">
  <pre><b>	d作为一个独立子集和每一个partition进行union:（a,b,c,d),(ab,c,d),(bc,a,d),(ac,b,d),(abc,d)；其次，是和每一个</b></pre>
</div>
<div align="left">
  <pre><b>	partition里的每一个子集union再组成partition：（ad,b,c),(a,bd,c),(a,b,cd),   (abd,c),(ab,cd),(acd,b),(ac,bd),</b></pre>
</div>
<div align="left">
  <pre><b>	(bcd,a),(bc,ad),(abcd)；然后，这两种partition再union组成所有的partitions.</b></pre>
</div>
<div align="left">
  <pre><b>2。 程序思路：其实我心里一直对递归调用比较抵触，因为，代码虽然好看，也容易写，可是，对效率实在是不负责任。可是，没有办法，我暂时</b></pre>
</div>
<div align="left">
  <pre><b>	还想不出怎样改。</b></pre>
</div>
<div align="left">
  <pre><b>3。 主要函数介绍：</b></pre>
</div>
<div align="left" style="width: 892; height: 102">
  <pre><b>	A. </b>void Partition::addNumber(int number)</pre>
  <pre><b>	<span lang="zh-cn">这个函数是做什么用的？</span>这个就是新加一个元素number时候，怎样生成新的partition,里面PtrList的一个方法</b></pre>
  <pre><b>	addNumber(int index, int number)，这个函数生成一个新的PtrList并拷贝原来的所有数据，并且在index指定的IntList里加入</b></pre>
  <pre><b>	一个number。</b>	
</pre>
  <blockquote>
    <pre><b><span lang="zh-cn">   </span>B. void Partition::display()</b></pre>
    <pre><b>   要显示每一个成员，实际上只要每一个从mylist继承下来的类，在onDisplay函数实现以下，就可以了，我原来为了检验，进行三重</b></pre>
    <pre><b>   循环遍历，效果和一句调用lst.display()是一样的。</b></pre>
  </blockquote>
  <pre><b>4。 不足之处：</b></pre>
  <pre><b>	A. <span lang="zh-cn">partition(int number)的参数实际上是number+1,不过，我懒得改了</span>。</b></pre>
  <pre><b>	B. 会不会有人不明白怎样使用generator这类的发生类？很可能，所以，我还要写一个遍历每一个partition的方法，以便输出这些</b></pre>
  <pre><b>	序列号，以供调用者引用这些数组下标，明白了吗？</b></pre>
</div>
<pre>#include &lt;iostream&gt;
#include &lt;iomanip&gt;

using namespace std;

template&lt;class T&gt;
class mylist
{
private:
	T *flist;
	int LENGTH;
	int SIZE;
	int counter;
	int bruteForce(T ptr);
protected:
	void uninitialize();
	void initialize();
	bool checksize();
	void expand();
	int locate(T ptr);
	virtual void onRemove(T ptr);  //
	virtual void onDisplay(T ptr);  //derived class must implement their own methods
public:	
	mylist();
	~mylist();
	void add(T ptr, bool sorted=true);
	bool find(T ptr, bool sorted=true);
	void display();
	int count();
	T&amp; items(int index);
	void insert(int index, T ptr);
	void remove(int index);
};

//int list
class IntList: public mylist&lt;int&gt;
{
protected:
	void onDisplay(int ptr);
public:
	IntList&amp; operator=(IntList&amp; dummy);
};

//int* list	
class PtrList: public mylist&lt;IntList*&gt;
{
protected:
	void onRemove(IntList* ptr);
	void onDisplay(IntList* ptr);
public:
	PtrList* addNumber(int index, int number);
	IntList* addItem();
};


//int** list
class NodeList: public mylist&lt;PtrList*&gt;
{
protected:
	void onRemove(PtrList* ptr);
	void onDisplay(PtrList* ptr);
};

class Partition
{
private:
	NodeList lst;
	void addNode();
	void addPtr(int node);
	void addItem(int node, int ptr, int data);
	void addNumber(int number);
	int nodeCount();
	int ptrCount(int node);
	int itemCount(int node, int ptr);
public:
	void partition(int number);
	void display();
};


class Container
{
private:
	void onVisitItem(int data);
	void onVisitNode(IntList* ptr);
	PtrList lst;
	void addNumber(int number);
	void multiplyNumber(int number);
public:
	int nodeCount();
	int itemCount(int node);
	void addItem(int node, int data);
	int getItem(int node, int index);
	void eachNode();
	void eachItem(int node);
	void traverse();
};



int main()
{
	
	Partition P;
	P.partition(4);
	P.display();

	return 0;
}

void Partition::display()
{
	lst.display();
	/*
	int number=0;
	for (int i=0; i&lt;lst.count(); i++)//PtrList*
	{
		cout&lt;&lt;&quot;Partition: &quot;;
		for (int j=0; j&lt;lst.items(i)-&gt;count(); j++) //IntList*
		{
			cout&lt;&lt;&quot; group &quot;; 
			for (int k=0; k&lt;lst.items(i)-&gt;items(j)-&gt;count(); k++)//int
			{
			
				cout&lt;&lt;lst.items(i)-&gt;items(j)-&gt;items(k)&lt;&lt;&quot;  &quot;;
			}
			cout&lt;&lt;&quot;\t&quot;;
		}
		cout&lt;&lt;endl;
		number++;
	}
	cout&lt;&lt;&quot;total number is:&quot;&lt;&lt;number&lt;&lt;endl;
	*/
}

void Partition::addNumber(int number)
{
	int oldCount= lst.count();
	IntList* ptr;
	PtrList* oldPtr, * newPtr;
	for (int i=0; i&lt; oldCount; i++)
	{
		oldPtr = lst.items(i);
		for (int j=0; j&lt;oldPtr-&gt;count(); j++)
		{
			newPtr = oldPtr-&gt;addNumber(j, number);			
			lst.add(newPtr, false);
		}
		ptr = new IntList;
		ptr-&gt;add(number);
		oldPtr-&gt;add(ptr, false);
	}
}



void Partition::addNode()
{
	PtrList* ptr = new PtrList;
	lst.add(ptr, false);
}

void Partition::addPtr(int node)
{
	if (node&lt;nodeCount())
	{
		IntList* ptr= new IntList;
		lst.items(node)-&gt;add(ptr, false);
	}
	else
	{
		cout&lt;&lt;&quot;Exceed max node!&quot;&lt;&lt;endl;
	}
}

void Partition::addItem(int node, int ptr, int data)
{
	if (node&lt;nodeCount())
	{
		if (ptr&lt;lst.items(node)-&gt;count())
		{
			lst.items(node)-&gt;items(ptr)-&gt;add(data);
		}
	}
	else
	{
		cout&lt;&lt;&quot;Exceed max node or ptr!&quot;&lt;&lt;endl;
	}
}


int Partition::nodeCount()
{
	return lst.count();
}

int Partition::ptrCount(int node)
{
	if (node&lt;lst.count())
	{
		return lst.items(node)-&gt;count();
	}
	else
	{
		return -1;
	}
}

int Partition::itemCount(int node, int ptr)
{
	if (node&lt;lst.count())
	{
		if (ptr&lt;lst.items(node)-&gt;count())
		{
			return lst.items(node)-&gt;items(ptr)-&gt;count();
		}
	}
	return -1;
}



void Partition::partition(int number)
{
	if (number==0)
	{
		addNode();
		addPtr(0);
		addItem(0, 0, 0);
	}
	else
	{
		partition(number -1);
		addNumber(number);
	}
}

void Container::traverse()
{
	for (int i=0; i&lt;lst.count(); i++)
	{
		eachItem(i);
	}
}

void Container::eachItem(int node)
{
	cout&lt;&lt;&quot;node is:&quot;&lt;&lt;node&lt;&lt;endl;
	cout&lt;&lt;&quot;and itemcount is:&quot;&lt;&lt;lst.items(node)-&gt;count()&lt;&lt;endl;
	onVisitNode(lst.items(node));
}

void Container::onVisitItem(int data)
{
	cout&lt;&lt;data&lt;&lt;endl;
}

void Container::onVisitNode(IntList* ptr)
{
	for (int i=0; i&lt; ptr-&gt;count(); i++)
	{		
		onVisitItem(ptr-&gt;items(i));
	}
}

int Container::itemCount(int node)
{
	return lst.items(node)-&gt;count();
}

int Container::nodeCount()
{
	return lst.count();
}




void Container::addItem(int node, int data)
{
	if (node &lt;lst.count())
	{
		lst.items(node)-&gt;add(data);
	}
	else
	{
		cout&lt;&lt;&quot;The node number is exceeding max!&quot;&lt;&lt;endl;
	}
}

int Container::getItem(int node, int index)
{
	return lst.items(node)-&gt;items(index);
}

void IntList::onDisplay(int data)
{
	cout&lt;&lt;data&lt;&lt;&quot;  &quot;;
}

IntList&amp; IntList::operator =(IntList&amp; dummy)
{
	for (int i=0; i&lt;dummy.count(); i++)
	{
		add(dummy.items(i), false);
	}
	return *this;
}

void NodeList::onDisplay(PtrList* ptr)
{
	cout&lt;&lt;&quot;one partition is:\n&quot;;
	ptr-&gt;display();
	cout&lt;&lt;endl;
}

void NodeList::onRemove(PtrList* ptr)
{
	delete ptr;
}

void PtrList::onRemove(IntList* ptr)
{
	delete ptr;
}

IntList* PtrList::addItem()
{
	IntList* ptr = new IntList;
	add(ptr, false);
	return ptr;
}

void PtrList::onDisplay(IntList* ptr)
{
	cout&lt;&lt;&quot;group: &quot;;
	ptr-&gt;display();
	cout&lt;&lt;&quot;   &quot;;
}

PtrList* PtrList::addNumber(int index, int number)
{
	PtrList * ptr = new PtrList;
	for (int i=0; i&lt; count(); i++)
	{
		*(ptr-&gt;addItem()) = *(items(i));
		if (i==index)
		{
			ptr-&gt;items(i)-&gt;add(number);
		}
	}
	return ptr;
}


template&lt;class T&gt;
void mylist&lt;T&gt;::onRemove(T ptr)
{
}

template&lt;class T&gt;
void mylist&lt;T&gt;::remove(int index)
{
	int temp= index;
	if (index&lt;counter)
	{
		onRemove(items(index));
		while (temp&lt;counter-1)
		{	
			
			items(temp) = items(temp+1);
			temp++;	
		}
		counter--;
	}
}

template&lt;class T&gt;
void mylist&lt;T&gt;::insert(int index, T ptr)
{
	if (!checksize())
		expand();

	if (counter == 0)
	{
		items(0) = ptr;
		counter++;
	}
	else
	{
		if (index&gt;=0&amp;&amp; index&lt;=counter)
		{
			int i=index;
			T hold1 = items(index), hold2= items(index+1);
			while (i&lt;counter)
			{	
				hold2 = items(i+1);
				items(i+1) = hold1;
				hold1 = hold2;				
				i++;
			}
			items(index) = ptr; //any exception trap???
			counter++;
		}
	}
}
			
template&lt;class T&gt;
int mylist&lt;T&gt;::locate(T ptr)
{
	int index = 0;
	while (items(index) &lt;ptr &amp;&amp;index &lt;counter)
	{
		index++;
	}
	return index;
}

template&lt;class T&gt;
int mylist&lt;T&gt;::bruteForce(T ptr)
{
	for (int index=0; index&lt;counter; index++)
	{
		if (items(index)==ptr)
		{
			break;			
		}
	}
	return index;
}

template&lt;class T&gt;
bool mylist&lt;T&gt;::find(T ptr, bool sorted)
{
	int index = 0;
	if (sorted)
	{
		index = locate(ptr);
	}
	else
	{
		index = bruteForce(ptr);
	}
	if (index == counter)
	{
		return false;
	}
	else
	{
		return (items(index) == ptr);
	}
}


template&lt;class T&gt;
int mylist&lt;T&gt;::count()
{
	return counter;
}

template&lt;class T&gt;
T&amp; mylist&lt;T&gt;::items(int index)
{
	return flist[index];
}

template&lt;class T&gt;
void mylist&lt;T&gt;::onDisplay(T ptr)
{
//	cout&lt;&lt;ptr;
}


template&lt;class T&gt;
void mylist&lt;T&gt;::display()
{
	cout&lt;&lt;setiosflags(ios::showpoint|ios::fixed);
	for (int i = 0; i &lt; counter; i ++)
	{
		onDisplay(flist[i]);
	}
}

template&lt;class T&gt;
void mylist&lt;T&gt;::uninitialize()
{
	for (int i=0; i&lt;counter; i++)
	{
		onRemove(items(i));
	}
	free(flist);
}

template&lt;class T&gt;
mylist&lt;T&gt;::~mylist()
{
	uninitialize();
}


template&lt;class T&gt;
void mylist&lt;T&gt;::add(T ptr, bool sorted)
{ 
	if (sorted)
	{
		int index;
		index = locate(ptr);
		if (items(index)!=ptr)
		{
			insert(index, ptr);
		}
	}
	else
	{
		insert(counter, ptr);
	}
}

template&lt;class T&gt;
void mylist&lt;T&gt;::initialize()
{
	LENGTH = 10;
	SIZE = LENGTH;
	if ((flist =(T*)(malloc(sizeof(T) * SIZE)))==NULL)
	{
		//exception need to be handled here!!
		cout&lt;&lt;&quot;Unable malloc memory for size of &quot;&lt;&lt;SIZE&lt;&lt;endl;  		
	}
	counter = 0;
}

template&lt;class T&gt;
bool mylist&lt;T&gt;::checksize()
{
	return (counter &lt; SIZE);
}

template&lt;class T&gt;
void mylist&lt;T&gt;::expand()
{
	SIZE += LENGTH;
	if ((flist = (T*)(realloc(flist, sizeof(T) * SIZE)))== NULL)
	{
		cout&lt;&lt;&quot;Unable realloc memory for mylist of size &quot;&lt;&lt;SIZE&lt;&lt;endl;
	}
}

template&lt;class T&gt;
mylist&lt;T&gt;::mylist()
{
	initialize();
}
</pre>
<pre>
</pre>
<pre></pre>
<pre>　</pre>
<pre>　</pre>
<pre><span lang="zh-cn">The following is the output which is quite unpleasing.</span></pre>
<pre><a name="result"></a></pre>
<pre>one partition is:
group: 0     group: 1     group: 2     group: 3     group: 4     
one partition is:
group: 0  1     group: 2     group: 3     group: 4     
one partition is:
group: 0  2     group: 1     group: 3     group: 4     
one partition is:
group: 0     group: 1  2     group: 3     group: 4     
one partition is:
group: 0  1  2     group: 3     group: 4     
one partition is:
group: 0  3     group: 1     group: 2     group: 4     
one partition is:
group: 0     group: 1  3     group: 2     group: 4     
one partition is:
group: 0     group: 1     group: 2  3     group: 4     
one partition is:
group: 0  1  3     group: 2     group: 4     
one partition is:
group: 0  1     group: 2  3     group: 4     
one partition is:
group: 0  2  3     group: 1     group: 4     
one partition is:
group: 0  2     group: 1  3     group: 4     
one partition is:
group: 0  3     group: 1  2     group: 4     
one partition is:
group: 0     group: 1  2  3     group: 4     
one partition is:
group: 0  1  2  3     group: 4     
one partition is:
group: 0  4     group: 1     group: 2     group: 3     
one partition is:
group: 0     group: 1  4     group: 2     group: 3     
one partition is:
group: 0     group: 1     group: 2  4     group: 3     
one partition is:
group: 0     group: 1     group: 2     group: 3  4     
one partition is:
group: 0  1  4     group: 2     group: 3     
one partition is:
group: 0  1     group: 2  4     group: 3     
one partition is:
group: 0  1     group: 2     group: 3  4     
one partition is:
group: 0  2  4     group: 1     group: 3     
one partition is:
group: 0  2     group: 1  4     group: 3     
one partition is:
group: 0  2     group: 1     group: 3  4     
one partition is:
group: 0  4     group: 1  2     group: 3     
one partition is:
group: 0     group: 1  2  4     group: 3     
one partition is:
group: 0     group: 1  2     group: 3  4     
one partition is:
group: 0  1  2  4     group: 3     
one partition is:
group: 0  1  2     group: 3  4     
one partition is:
group: 0  3  4     group: 1     group: 2     
one partition is:
group: 0  3     group: 1  4     group: 2     
one partition is:
group: 0  3     group: 1     group: 2  4     
one partition is:
group: 0  4     group: 1  3     group: 2     
one partition is:
group: 0     group: 1  3  4     group: 2     
one partition is:
group: 0     group: 1  3     group: 2  4     
one partition is:
group: 0  4     group: 1     group: 2  3     
one partition is:
group: 0     group: 1  4     group: 2  3     
one partition is:
group: 0     group: 1     group: 2  3  4     
one partition is:
group: 0  1  3  4     group: 2     
one partition is:
group: 0  1  3     group: 2  4     
one partition is:
group: 0  1  4     group: 2  3     
one partition is:
group: 0  1     group: 2  3  4     
one partition is:
group: 0  2  3  4     group: 1     
one partition is:
group: 0  2  3     group: 1  4     
one partition is:
group: 0  2  4     group: 1  3     
one partition is:
group: 0  2     group: 1  3  4     
one partition is:
group: 0  3  4     group: 1  2     
one partition is:
group: 0  3     group: 1  2  4     
one partition is:
group: 0  4     group: 1  2  3     
one partition is:
group: 0     group: 1  2  3  4     
one partition is:
group: 0  1  2  3  4     
</pre>
<pre>

</pre>
<pre>　</pre>
<pre></pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        
&nbsp; <a href="QuickSort.htm"><img src="picture/back.gif"    
style="border: medium none" width="32" height="35" alt="back.gif (341 bytes)"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
<a href="index.htm"><img src="picture/up.gif" style="border: medium none" width="35"
height="32" alt="up.gif (335 bytes)"></a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="pirate.htm"><img src="picture/next.gif" style="border: medium none" width="32"    
height="35" alt="next.gif (337 bytes)"></a></p>

</body>

</html>