不相交集ADT--链表实现
每一个集合用用一个链表来表示。链表的第一个对象作为它所在集合的代表。链表中每个对象都包含一个集合成员,一个指向下一个对象的指针,以及指向代表的指针。每个链表含head和tail指针,head指向链表的代表,tail指向链表中最后的对象。
如下图所示:

Union的简单实现:将x所在的链表拼接到y所在链表的表尾。对于原先x所在链表中的每一个对象都要更新其指向代表的指针。
如下图所示:

根据以上思想,代码如下:
#include<iostream> using namespace std; #define NumSets 8 typedef struct Node *Position;
typedef struct Node *Head;
typedef Head DisjSet[NumSets + 1]; //对于头节点,head_node指向第一个元素,tail指向最后一个元素,Key为该集合的大小
//对于普通节点,head_node指向第一个元素,tail指向后面的一个元素,相当于Next,Key为关键字
struct Node
{
Position head_node;
Position tail;
int Key;
}; Head Make_One_Node (int x)
{
Head Head_one = (Head)malloc(sizeof(Node)); //先申请一个头结点
Head_one->Key = 1; //个数为1 Position p = (Position)malloc(sizeof(Node)); //这个节点才是存储数据的节点 p->Key = x;
p->head_node = p; //普通节点的hand_node域指向第一个元素,此时就是它本身
p->tail = NULL; Head_one->head_node = p; //头节点的hand_node域指向第一个元素
Head_one->tail = p; //头节点的tail域指向最后一个元素 return Head_one;
}
void Set_Union (Head head1, Head head2)
{
Head tempHead;
if (head1->Key < head2->Key )
{
tempHead = head1;
head1 = head2;
head2 = tempHead;
} //把短的接在长的后面 //下面两句话的位置不能交换,否则会陷入死循环
head1->tail->tail = head2->head_node; //head1最后一个元素的tail域指向head2的第一个元素
head1->tail = head2->tail ; //head1的tail域指向head2的最后一个元素,也就是head2->tail Position p = head2->head_node ;
while(p)
{
p->head_node = head1->head_node ;//head2的所有元素都指向head1的第一个元素
p = p->tail;
}
head1->Key += head2->Key ; //释放head2的所有元素
head2->Key = 0;
head2->head_node = NULL;
head2->tail = NULL; } Head Set_Find (DisjSet S,int x) //返回该节点的头结点
{
for (int i = 1; i <= NumSets; ++i)
{
Position p = S[i]->head_node ;
while(p)
{
if(x == p->Key )
return p->head_node;
else
p = p->tail;
} }
} void printf_list(DisjSet S)
{
for (int i = 1; i <= NumSets; ++i)
{
if(S[i]->Key == 0)
{
cout << "第 "<< i << " 个集合没有元素。" <<endl;
}
else
{
cout << "第 "<< i << " 个集合一个共有 " << S[i]->Key << " 个元素,分别是:";
Position p = S[i]->head_node ;
while(p)
{
cout << p->Key << "\t";
p = p->tail;
}
cout << endl;
} } } int main ()
{
DisjSet S;
for (int i = 1; i <= NumSets; ++i)
{
S[i] = Make_One_Node (i);
}
Set_Union (S[1], S[2]);
Set_Union (S[3], S[4]);
Set_Union (S[3], S[1]);
printf_list(S); cout << Set_Find (S,5)->Key << endl; return 0;
}
看着比数组实现要复杂一点啊。
夜深了,,,
今天5月20号啊,520啊,还是周末啊,还在写代码,代码才是真爱。
不相交集ADT--链表实现的更多相关文章
- 不相交集ADT 你是和谁是一类人?
//不相交集ADT (抽象数据类型) //一般用于集合运算 //用树,这种结构组成,有多个树(=森林) //属于同一颗数的元素,表示处于同一个集合中 //主要支持2个操作. //1. Find操作,找 ...
- 栈ADT的链表实现
/* 栈ADT链表实现的类型声明 */ struct Node; typedef struct Ndoe *PtrToNode; typedef PtrToNode Stack; struct Nod ...
- 【WIP_S3】链表
创建: 2017/12/26 完成: 2018/01/14 [TODO] S4, S5, S14来处理动态数组 CAF8A81B790F [github 地址]传送门 链表的定义 ...
- Android开发project师,前行路上的14项技能
导读: 你是否曾渴望回到宋朝? 或者什么朝,反正就是男耕女织的古代. 哦,那时的首都在汴梁(开封),房价想必没有如今这么高,工作?无非就是给你把锄头,去,种地去.夕阳西下了,麦子垛后,你和翠姑搂抱在一 ...
- 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案
转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...
- 最小生成树——Kruskal(克鲁斯卡尔)算法
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 Kruskal(克鲁斯卡尔)算法 的idea 并用 源代码加以实现: 0.2)最小生成树的基础知识,参见 ...
- 不相交集(The Disjoint Set ADT)
0)引论 不相交集是解决等价问题的一种有效的数据结构,之所以称之为有效是因为,这个数据结构简单(几行代码,一个简单数组就可以搞定),快速(每个操作基本上可以在常数平均时间内搞定). 首先我们要明白什么 ...
- 【ADT】链表的基本C语言实现
什么是抽象数据类型?首先,这一概念是软件开发人员在力求编写的代码健壮.易维护且可以复用的过程中产生的.英文是AbstractData Type.有人将其比作"抽象"的墙壁,&quo ...
- 单链表ADT
本博客第一篇学术性博客,所以还是写点什么东西: 首先这篇博客以及以后的博客中的代码尽量百分之90是自己写过的: 可能有部分图片和代码是我认为别人更好的故摘抄下来, 本人三观正确,所以一定会表明来源: ...
- 分离链表法散列ADT
分离链表法解决冲突的散列表ADT实现 数据结构定义如下: struct ListNode; typedef struct ListNode *Position; struct HashTbl; typ ...
随机推荐
- python 内置函数02
1. lambda 匿名函数 lambda 参数: 返回值 #常规计算两个数相加的函数 def func(a,b): return a+b print(func(1,9)) #lambda函数 my_ ...
- 【入门向】使用 MetaHook Plus 绘制 HUD
MetaHook Plus 是一个GoldSrc引擎(就是的Half-Life.CS1.6的引擎)的客户端插件平台,它可以加载我们自己开发的DLL插件. 首先你需要安装一个 Visual Studio ...
- 【Java】常用POI生成Excel文档设置打印样式
package poi_test; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi ...
- 【一】shiro入门 之 Shiro简介
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境.Shiro 可以帮助我们完成:认证.授权.加密.会话管理.与Web 集成.缓存等.这不就是 ...
- DNA Sequence POJ - 2778 (ac自动机 + 快速幂)
题意: 给出患病的DNA序列,问序列长度为n的,且不包含患病的DNA序列有多少种 解析: 以给出的患病DNA序列建trie树 患病结点要用flag标记 对于长度为n的序列 位置i有四种 情况A C ...
- git用户名和邮箱配置
1. 设置全局用户名和邮箱 git config --global user.name "xxx" git config --global user.email "xxx ...
- 解题:由乃OI 2018 五彩斑斓的世界
题面 写在前面的扯淡: 分块的总体学习告一段落,这算是分块集中学习的最后一题么:以后当然也可能会写,就是零零散散的题了=.= 在洛谷上搜ynoi发现好像只有这道题和 由乃OI 2018 未来日记 是分 ...
- 【bzoj3796】Mushroom追妹纸
Portal -->bzoj3796 Description 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 求w的 ...
- js中字符串全部替换
废话不多说,直接发结果 在js中字符串全部替换可以用以下方法: str.replace(/需要替换的字符串/g,"新字符串") 比如: "yyyy-MM-dd-hh-mm ...
- 「Python」python日期与字符串互转
1str -> date import datetime detester = ‘2017-01-01' date = datetime.datetime.strptime(detester,’ ...