山东大学数据结构实验四:在线等价类

一、实验内容:

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; 
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值