集合操作过程:最重要掌握集合总并查集:使用结构体数组对其进行模拟,根节点负数表示(-3 表示此集合中有三次子节点),同时采用双亲表示法,子节点采Parent
#include<iostream> using namespace std; #define ElementType int //使用结构体数组表示树 //typedef ElementType SetType[10]; typedef struct SetType{ ElementType Data; int Parent; }settype; int Find(SetType S[],int X,int N) { //先找到X在数组中位置 int i=0; for(i=0;i<N &&S[i].Data!=X;i++); if(i>=N) return -1; for(;S[i].Parent>=0;i=S[i].Parent); return i; } void Union(int X1,int X2,SetType S[],int N) { //-1 *size,表示数量 int Root1=Find(S,X1,N); int Root2=Find(S,X2,N); if(S[Root1].Parent<S[Root2].Parent) { S[Root1].Parent=S[Root1].Parent+S[Root2].Parent; S[Root2].Parent=Root1; } else { S[Root2].Parent=S[Root1].Parent+S[Root2].Parent; S[Root1].Parent=Root2; } for(int i=0;i<N;i++) { cout<<S[i].Data<<" "<<S[i].Parent<<endl; } } int main() { int Total; cin>>Total; SetType *Set=new SetType[Total]; int a,b; for(int i=0;i<Total;i++) { cin>>a>>b; Set[i].Data=a; Set[i].Parent=b; } cout<<"对数组输出测试"<<endl; for(int i=0;i<Total;i++) { cout<<Set[i].Data<<" "<<Set[i].Parent<<endl; } int X,Root1,Root2; cin>>X; Root1=Find(Set,X,Total); cout<<"根节点是"<<Root1; cout<<"节点合并"<<endl; cin>>Root1>>Root2; Union(Root1,Root2,Set,Total); return 0; }