一、实验内容:
1、使用模拟指针实现本实验。
2、输入一个1-9的正整数n,代表要创建n个元素,例如输入5,则代表创建一个1,2,3,4,5组成的元素表。
3、再输入一个大于0正整数m,代表后面要输入m个等价关系。
4、分行输入m个等价关系,格式如(1,2)。
5、分行输出所有等价类。
二、实验步骤:
1、参考课件,理解好模拟指针的实现过程。编写了node类和初始化方法以及寻找等价类的方法,然后按照课件上,控制时间复杂度最低实现合并两个等价类。
2、按格式处理输入数据,我的dev版本不足c++11所以不能用stoi函数转化成数字,发现数字为1~9,因此用char类型-‘0’获取数字。
3、由于合并之后的数组并不是按照顺序的,所以不方便进行输出操作。因此我编写的输出逻辑是把node数组从前向后遍历,遇到不同的等价类的话,如果这个等价不为0,就从前向后寻找与之等价类相同的节点输出,输出之后及时清零。
4、运行结果样例展示:
本次实验主要代码:
#include<bits/stdc++.h>
using namespace std;
class ENode{
public:
int E,size,link;
};
ENode *node;
void chushihua(int n)
{
node = new ENode [n+1];
for (int e = 1; e <= n; e++) {
node[e].E = e;
node[e].link = 0;
node[e].size = 1;
}
}
int F(int e)
{ //搜索包含元素i 的类
return node[e].E;
}
void swap(int &i,int &j){
int temp = i;
i= j;
j=temp;
}
void U(int i, int j)
{ //合并类i 和类j;
// 使i 代表较小的类
if (node[i].size > node[j].size)
swap ( i , j ) ;
//改变较小类的E值
int k;
for (k = i; node[k].link; k = node[k].link)
node[k].E = j;
node[k].E = j; // 链尾节点
//在链表j的首节点后插入链表i;并修改
//新链表大小
node[j].size += node[i].size;
node[k].link = node[j].link;
node[j].link = i;
}
int main(){
cout<<"Input"<<endl;
int n;cin>>n;
int ans[n+1];
chushihua(n);
int x;cin>>x;
for(int i=0;i<x;i++){
string temp;
cin>>temp;
int a=temp.at(1)-'0';
int b=temp.at(3)-'0';
int ea = F(a);
int eb = F(b);
if(ea!=eb)
U(ea,eb);
}
cout<<"Output"<<endl;
for(int i=1;i<=n;i++){
if(node[i].E!=0){
int tot=0;
for(int j=1;j<=n;j++){
if(node[j].E == node[i].E){
tot++;
}
}
cout<<"(";
for(int j=1;j<=n;j++){
if(node[j].E == node[i].E && tot>1){
if(i!=j){
node[j].E=0;
}
cout<<j<<",";
tot--;
}
else if(tot == 1 &&node[j].E == node[i].E){
if(i!=j){
node[j].E=0;
}
cout<<j<<")"<<endl;
}
}
node[i].E=0;
}
}
cout<<"End0"<<endl;
return 0;
}