c语言实现抽象数据类型,集合抽象数据类型的C语言实现

#include #include#include"list.h"#include"set.h"

/*set_init 初始化一个集合*/

void set_init(Set *set,int(*match)(const void *key1,const void *key2), void(*destroy)(void *data))

{/*调用list_init*/list_init(set,destroy);/*单独初始化match成员*/

set->match =match;return;

}/*set_insert 向集合中插入一个成员*/

int set_insert(Set *set,const void *data)

{

/*不能向集合中插入已有成员*/

if(set_is_member(set,data))

return -1;

/*调用list_ins_next插入元素至尾端*/

return list_ins_next(set,list_tail(set),data);

}

/*set_remove 移除元素*/

int set_remove(Set *set,void **data)

{

ListElmt *member, *prev;

/*查找要移除的成员*/

prev=NULL;

/*遍历链表*/

for(member=list_head(set); member != NULL; member = list_next(member))

{

if(set->match(*data,(list_data(member)))

break;

prev=member; /*prev刚好指向匹配成功的成员的前一个成员*/

}

/*没有找到成员则返回*/

if(member==NULL)

return -1;

/*移除成员*/

return list_rem_next(set,prev,data);

}

/*set_union 求解两个集合的并集*/

int set_union(Set *setu,const Set *set1,const Set *set2)

{

ListElmt *member;

void *data;

/*初始化一个并集集合*/

set_init(setu,set1->match,NULL);

/*将集合1的内容插入并集*/

for(member=list_head(set1);member!=NULL;member=list_next(member))

{

data=list_data(member);

if(list_ins_next(setu,list_tail(setu),data)!=0)

{

set_destroy(setu);

return -1;

}

}

/*插入集合2的成员*/

for(member=list_head(set2);member!=NULL;member=list_next(member))

{

if(set_is_member(set1,list_data(member)))

{

continue;

}

else

{

data=list_data(member);

if(list_ins_next(setu,list_tail(setu),data))!=0)

{

set_destroy(setu);

return -1;

}

}

}

return 0;

}

/*set_intersection 求解两个集合的交集*/

int set_intersection(Set *seti,const Set *set1,const Set *set2)

{

ListElmt *member;

void *data;

/*初始化交集集合*/

set_init(seti,set1->match,NULL);

/*同时在两个集合中出现的元素将被插入交集集合中*/

for(member=list_head(set1);member!=NULL;list_next(member))

{

if(set_is_member(set2,list_data(member))

{

data=list_data(member);

if(list_ins_next(seti,list_tail(seti),data))!=0)

{

set_destroy(seti);

return -1;

{

}

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 本演示程序中,集合元素限定为数字,大小由用户输入。集合中数字顺序不限,且一旦出现重复字符或非法字符,程序能自动滤去。输出的运算结果中将不含重复数字或非法字符,且按照从小到大的顺序输出。<br>2. 演示程序以用户和计算机的对话方式执行,即在计算机上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的数据输入和运算结果显示在其后。<br>3. 程序执行的命令包括:<br>(1)构造集合1;(2)构造集合2;(3)判断某数是否为集合元素;(4)添加元素;(5)删除元素;(6)求并集(存入集合1中);(7)求交集(存入集合3中);(8)输出集合1;(9)输出集合2;(0)退出。<br>“构造集合1”和“构造集合2”时,需以整型数字形式键入集合元素。<br><br>为实现上述程序功能,以线性链表表示集合。为此,需要两个抽象数据类型:线性表和集合。<br>1. 线性表的抽象数据类型定义为:<br> ADT LinkList{<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={< , >| , D, < ,i=2,…,n}<br> 基本操作:<br> InitList(*L)<br> 操作结果:构造一个空的线性链表L。<br> IsElement(*L,e)<br> 初始条件:线性表L已存在。<br> 操作结果:若e是L的数据元素,返回1,否则返回0。<br> Append(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:按照由大到小的顺序往线性表里插入元素e,不允许重复元素。<br> Delete(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:在L中删除元素e。<br> }ADT LinkList<br>2. 集合抽象数据类型定义为:<br> ADT LinkSet {<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={}<br> 基本操作:<br> CreatSet(*L)<br> 初始条件:s为整型数组。<br> 操作结果:生成一个由s中数字构成的集合。<br> Union(*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的并集构成的集合,返回到S1。<br> Intersection (*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的交集构成的集合,返回到S1。<br> PrintSet (*S)<br> 初始条件:集合S已存在。<br> 操作结果:依次显示集合S中的全部元素。<br> }ADT LinkSet<br><br><br>带菜单<br>Turbo c 3.0编写
一、 题目:图的抽象数据类型实现 利用VC++的工作环境实现教材里图的基本抽象数据类型。按照课本的要求运用c语言以及数据结构课程所学的知识,设计合理的数据存储结果,实现图的基本操作。 二、 抽象数据类型定义以及各基本操作的简要描述 ADT MGraph{ 数据对象:n=n是具有相同特征的数据元素集合,称为顶点集。 数据关系:DR={<v,w>|v,w∈n且<v,w>表示从v指向w的弧} 基本操作: CreateMGraph 初始条件:n是图的顶点集,e是图的边集 操作结果:按和n的e定义构造图G DestroyGraph 初始条件: 图G存在 操作结果: 销毁图G GetVex 初始条件: 图G存在,v是G中某个顶点 操作结果: 返回v的值 LocateVex 初始条件:图G存在,v和G中顶点有相同特征 操作结果:若G中存在顶点v,则返回该顶点再图中的位置;否则返回空 PutVex 初始条件: 图G存在,v是G中某个顶点 操作结果: 对v赋值u FirstAdjVex 初始条件: 图G存在,v是G中某个顶点 */ 操作结果: 返回的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回空 NextAdjVex 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点 操作结果: 返回v(相对w)的下一个邻接顶点。若w是v的最后一个邻接点,则返回空 InsertVex 初始条件: 图G存在,v和图G中顶点有相同特征 操作结果: 在图G中增添新顶点v(不增添与顶点相关的边,留待InsertArc()去做) DeleteVex 初始条件: 图G存在,v是G中某个顶点 操作结果: 删除G中顶点v及其相关的弧 InsertArc 初始条件: 图G存在,v和W是G中两个顶点 操作结果: 在G中增添弧<v,w> DeleteArc 初始条件: 图G存在,v和w是G中两个顶点 操作结果: 在G中删除弧<v,w> DFSTraverseM 初始条件:图G存在 操作结果:对图进行深度优先遍历 BFSTraverseM 初始条件:图G存在 操作结果:对图进行广度优先遍历 }ADT MGraph
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值