集合及其运算

题目:

描述一个集合的抽象数据类型ASet,其中所有元素为正整数且所有元素不相同,集合的基本运算包括:

(1)由整数组a[0...n-1]创建一个集合

(2)输出一个集合中的所有元素

(3)判断一个元素是否在集合中

(4)求两个集合的并集

(5)求两个集合的差集

(6)求两个集合的交集

在此基础上设计集合的顺序存储结构,并实现各基本运算的算法。

思路:可以采用顺序表的形式来表示集合这一抽象概念

typedef struct
{
int data[MaxSize];
int length;
}Set;

(1)分析:

由于初始为一个整数数组,因此可采用遍历的形式,将数组中的所有元素依次复制到线性表中。

void createset(Set &s,int a[],int n)
{
     int i;                //定义一个循环变量i
     for(i=0;i<n;i++)
      s.data[i]=a[i];      //依次遍历数组,从而将数组中的所有元素均复制到线性表中
     s.length=n;           //定义集合的长度为n
}

(2)分析:

用遍历的形式依次进行输出即可。

void dispset(Set s)
{  
    int i;
    for(i=0;i<s.length;i++)
      printf("%d",s.data[i]);
    printf("\n");
}

(3)分析:

首先采用i的形式依次遍历数组,然后在其中嵌套一个if语句进行条件判断

bool inset(Set s,int e)
{
    int i;
    for(i=0;i<s.length;i++)             //采用i依次遍历数组
     if(s.data[i]==e) return true;      //倘若数组中含有该元素,则返回真
    return false;                       //不含有该元素,则返回假
}

(4)分析:

该函数首先将s1中的全部元素复制到s3中,然后在遍历s2的过程中,调用if语句判断s2中的元素是否重复出现于s1中,倘若没有重复出现,则将s2中的元素复制到s3中。

void Bing(Set s1,Set s2,Set &s3)
{
    int i;                                  //定义循环变量i在数组中进行遍历
    for(i=0;i<s.length;i++)                 //遍历s1
       s3.data[i]=s1.data[i];               //将s1中的数据全部复制到s3中
    s3.length=s1.length;                    //规定s3的长度暂为s1的长度
    for(i=0;i<s2.length;i++)                //遍历s2
       if(!inset(s1,s2.data[i]))            //if成立条件为s2中的数组不在s1中出现
       {
          s3.data[s3.length]=s2.data[i];     //此时将符合条件的元素添加到s3中
          s3.length++;                       //s3的长度自增
       } 
}

(5)分析:

该运算主要是求仅在s1中而不在s3中的元素,因此需要将s1中所有的元素均进行遍历,然后逐一进行条件判断。

void sub(Set s1,Set s2,Set &s3)
{
    int i;
    s3.length=0;
    for(i=0;i<s1.length;i++)
          if(!inset(s2,s1.data[i])) 
           {
               s3.data[s3.length]=s1.[data];
               s3.length++;
           }
}

(6)分析:

该运算主要是求既在s1也在s2中的元素,但在实际操作时,只需要遍历s1和s2的其中一个数组即可,然后对其中的每个元素均进行条件判断。

void intersection(Set S1,Set S2,Set &S3)
{
     int i;                    //定义循环变量i
     s3.length=0;              //初始s3.length=0;
     for(i=0;i<s1.length;i++)  //遍历集合s1
      if(inset(s2,s1.data[i]))  //倘若s1中的数据也存在于s2中
      {
         s3.data[s3.length]=s1.data[i];   //将s1中的数据复制到s3中
         s3.length++;                     //s3.length自增
      }
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
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编写

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雪心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值