#ifndef EQUIVNODE_H
#define EQUIVNODE_H
#include <iostream>
struct equivNode
{
int equivClass, // 元素类标识符
size, // 类的元素个数
next; // 类中指向下一个元素的指针
};
equivNode* node; // 节点的数组
int n; // 元素个数
void initialize(int numberOfElement)
{// 用每个类的一个元素,初始化 numberOfElement 个类
n = numberOfElement;
node = new equivNode [n + 1];
for (int e = 1; e <= n; e++)
{
node[e].equivClass = e;
node[e].next = 0; // 链表中没有下一个节点
node[e].size = 1;
}
}
void unite(int classA, int classB)
{// 合并类 classA 和 classB
// 架设 chassA != classB
// classA 和 classB 是链表首元素
// 使 classA 成为较小的类
if (node[classA].size > node[classB].size)
std::swap(classA, classB);
// 改变较小类的 equivClass 值
int k;
for (k = classA; node[k].next != 0; k = node[k].next)
node[k].equivClass = classB;
node[k].equivClass = classB; // 链表的最后一个节点
// 在链表 classB 的首元素之后插入链表 classA
// 修改新链表的大小
node[classB].size += node[classA].size;
node[k].next = node[classB].next;
node[classB].next = classA;
}
int find(int theElement)
{// 查找
return node[theElement].equivClass;
}
#endif // !EQUIVNODE_H
|