数据结构实验之在线等价类

本文介绍如何使用模拟指针在C++中实现在线等价类的创建、合并和输出。通过实例演示了输入正整数n和等价关系r,构建元素表并根据输入关系合并等价类,最后按从小到大顺序输出所有等价类的过程。遇到超时或异常提示可能源于数据成员初始化问题。
摘要由CSDN通过智能技术生成

二、 实验目的
掌握在线等价类的使用,要求使用模拟指针实现。
三、 实验内容
1、 使用模拟指针实现本实验。
2、 输入一个1-9的正整数n,代表要创建n个元素,例如输入5,则代表创建一个1,2,3,4,5组成的元素表。
3、 再输入一个大于0正整数r,代表后面要输入r个等价关系。
4、 分行输入r个等价关系,格式如(1,2)。
5、 分行输出所有等价类,一个等价类的元素由小到大依次输出。例如等价类(1,3,5,2,4),输出时排序输出(1,2,3,4,5)。
6、 如果输出不是由小到大顺序输出,解决办法很多,可以创建一个n*n的数组,一行存放一个等价类,将所有等价类放入数组,对数组每一行元素进行排序,输出数组所有元素。
四、 重要提醒
很多人出现“运行超时”“异常退出”,那是程序不稳定,就会异常退出或者运行超时。原因是没有在构造函数中对数据成员进行初始化操作。

#include <iostream>
using namespace std;
struct SimNode
{
    int next;
    int count;
};

const int size= 20;
void Union(int a, int b, SimNode* s);
int find(int a, SimNode* s);
void initial(int a, SimNode* s);
void equiva(SimNode* s, int n);
void output(SimNode* s, int n);


int main()
{
	SimNode s[size];
	int i;
	cout<<"Input"<<endl;
	cin>>i; 
    equiva(s, i);                    //求出数组c中的等价类
    cout<<"Output" << endl;
    output(s, i);                //输出等价类
    cout << "End" << endl; 
    system("pause");
	return 0;
}

void Union(int a, int b, SimNode* s)     //合并数组c中的a, b两个集合
{
    if(s[a].count>s[b].count)
    {
        s[b].next=a;
        s[a].count+=s[b].count;
    }
    else
    {
        s[a].next=b;
        s[b].count+=s[a].count;
    }
}

int find(int a, SimNode* s)             //在数组c中查找元素a所在的集合的根结点
{
    int i=a;
    while(s[i].next)
        i=s[i].next;
    return i;
}

void initial(int a, SimNode* s)        //把数组c中的每个元素各建立一个只包含元素自己集合
{
    s[a].next=0;
    s[a].count=1;
}

void equiva(SimNode* s, int n)         //n记录c数组中元素的个数,求出数组c中的等价类
{   int r;
    cin >> r;
    int i, j, m, k,count;
    for(i=1; i<=n; i++)
    {
        initial(i, s);
    }
    char c1,c2,c3;
    
	                    
    for(count=0;count<r;count++)
    {cin >> c1 >> i >> c2 >> j >> c3;
        k=find(i,s);
        m=find(j,s);
        if(k != m)
            Union(k, m, s);
        
    }
}

void output(SimNode* s, int n)        //输出数组c中的等价类, n为元素的个数
{
    int i, j=0, b[size], m,k;
    for(i=1; i<=n; i++)
    {
        if(s[i].next==0)
        {
            b[j++]=i;
        }
    }
    m=j;
   int count=0;
    for(i=0; i<m; i++)
    {   int container[1000];
	    cout << "("; 
        for(j=1; j<=n; j++)
        { 
            if(b[i]==find(j, s))
            
			    container[count++]=j;
            
        }
        for(k=0;k<count-1;k++){
        	cout<<container[k]<<",";
		}
		cout << container[count-1]; 
        cout<<")"<<endl;
        count=0; 
    }
    

}

这个实验挺难的,可以认真看一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值