- 使用模拟指针实现本实验。
- 输入一个1-9的正整数n,代表要创建n个元素,例如输入5,则代表创建一个1,2,3,4,5组成的元素表。
- 再输入一个大于0正整数r,代表后面要输入r个等价关系。
- 分行输入r个等价关系,格式如(1,2)。
- 分行输出所有等价类,一个等价类的元素由小到大依次输出。例如等价类(1,3,5,2,4),输出时排序输出(1,2,3,4,5)。
- 如果输出不是由小到大顺序输出,解决办法很多,可以创建一个n*n的数组,一行存放一个等价类,将所有等价类放入数组,对数组每一行元素进行排序,输出数组所有元素。
这是一段在csdn上cv的代码,关于我在抄袭的过程中学到了什么:
简单捋一下思路:创造n个的链表,其中包含三个元素,等价类的标识符,链表长度,指针next,首先将n个元素分别放置在相应的等价类中,接下来读入输入的数对,进行等价类的合并。假如输入的数字是(x,y),首先要确定标识符的顺序,假定n1与n2是代表两个等价类的标识符,则用n1来表示较小的那一个,接下来的工作是将第二个等价类中的元素依次插入第一个等价类中,该过程中使用一个指针,假设为k,指向n2中第一个元素,n1中也将数组指针指向不大于n2中所指元素的数字,然后进行插入操作,插入过程中第二个链表会出现断连,此时需要用temp存储一下n2中元素的下一位,插入一个元素后,将指针k和数组指针均往后移动一位,移动插入过程中,若第一个链表的next为空,则将n1中第一个元素指向n2中此时所指的元素,若第二个链表的next为空,则使n2的元素的next指向n1中所指元素的next,即可实现等价类的排序合并。
while中条件的意思是如果n1后面还有元素,且n2中还有元素没有插入,则仍需要进行插入排序,
if中条件的意思是如果n1中没有元素了,但是n2中还有元素,则直接将n2中元素接在n1后面即可。
设置标识符的意义就在于给出一个元素,就可以直接知道这个元素的等价类,且等价类的标识符使用的是最小元素的值,这样输出的时候就可以避免重复输出,只输出本元素在本等价类这样的等价类即可。
最后还需要提及的一个小点是读入输入的数对时需要提取数字,此时用到了string。
浅谈一下课本上对在线等价类输出的想法:用到了递归