以上图片在自网络
1、可用树结构表示集合,树的每个结点代表集合中一个元素。
2、用树根代表这个集合。
因此我们查某个元素属于哪个集合,实际就是查寻树中结点的根结点。
因为我们只需要知道树中某个结点的父亲结点,因此我们可以用双亲表示法来表示树,我们可以选择链表或数组作为存储结构!
//链表对应的一个元素结点类型
typedef int Ele;
struct Tnode{
Ele e;
struct Tnode *parent;
};
//数组对应的一个元素结点类型--静态链表
typedef int Ele;
struct Tnode{
Ele e;
int parent;
}
不管什么存储结构只要能表示数据元素之间的逻辑关系就可以,此处我们选择数组表示
#include<stdio.h>
#define maxsize 100
typedef char Elem;
/**/
typedef struct N{
Elem e;
int parent;
}Node;
void init(Node s[]){
for(int i=0;i<maxsize;i++)
s[i].e=0,s[i].parent=-1;
}
int find(Node s[],Elem e){//找到某元素所在的集合,返回为数组的下标
int i=0;
for(;i<maxsize&&s[i].e!=e;i++)
;
if(i>maxsize)return -1;
for(;s[i].parent>=0;i=s[i].parent)
;
return i;
}
void unionn(Node s[],Elem e1,Elem e2){//将两元素所在集合合并
int root1,root2;
root1=find(s,e1);
root2=find(s,e2);
if(root1!=root2)
s[root1].parent=root2;//s[root2].parent=root1
}
int main(){
Node sss[maxsize];
init(sss);
sss[0].e='a';
sss[1].e='b';
sss[2].e='c';
sss[3].e='d';
unionn(sss,'a','b');
unionn(sss,'c','d');
unionn(sss,'d','b');
if(find(sss,'a')==find(sss,'d'))
printf("a and d connect");
else
printf("a and d not connect");
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。