集合的运算

  • 1.需求分析
  • 2.数据结构与模块化设计
    • 2.1 数据结构设计
    • 2.2 模块化设计
    • 2.3 总体功能流程图
  • 3.程序设计
  • 4.运行展示

1.需求分析

(1)建立两个含有若干个元素的单链表 A、B , 要求从文件读入数据,显示、保存函数公用。 集合的元素不限定,可以是大小写字母。演示程序以用户和计算机的对话方式执行。

(2)集合中(A与B的交集)包含所有既属于集合 A 又属于集合 B 的元素,显示计算后的结果并保存。

(3)集合中(A与B的并集)包含所有或属于集合 A 或属于集合 B 的元素, 显示计算后的结果并保存。

(4)集合中(A-B)包含所有属于集合 A 而不属于集合 B 的元素,显示计算后的结果并保存。

(5)判断集合 A 与 B 相等,输出结果。

(6)集合 A、B 的所有子集,显示计算后的结果并保存。

2.数据结构与模块化设计

2.1 数据结构设计

本程序采用单链表为存储结构,创建一个集合即初始化一个空链表,程序如下所示:

//定义单链表的结点
struct Node
{char data;struct Node *next;
};//初始化空集合
Gather::Gather()
{first=new Node;first=NULL;
}

2.2 模块化设计

本系统有 5 大模块及 7 小模块,与 main 函数之间的主要调用关系如图所示。

图中,3大模块**JiaoJi(),BingJi(),ChaJi(),Equal(),Subset()**分别用来实现两集合之间的交集、并集、差集、判相等及子集,5大模块的实现主要由7小模块之间的调用实现;

  • **Length()**函数,返回集合的长度;
  • **PrintList()**为遍历函数,用来实现集合的输出显示;
  • **Locate(char ch)**为按值查找函数,用来判断集合中是否存在元素ch;
  • **Insert(char ch)**为插入函数,用来实现集合的初始化;
  • **Get(int i)**为按位查找,用查找位置为i的值;
  • **Save(ofstream &fp)**为保存函数,将集合保存至指定的txt文件;
  • **Read(ifstream &fp)**为读取函数,从txt文件读取元素到集合中。

2.3 总体功能流程图

3.程序设计

(1)头文件 Gather.h

//Gather.h
#ifndef GATHER_H
#define GATHER_H
#include<fstream>
using namespace std;//定义单链表的结点
struct Node
{char data;struct Node *next;
};//定义集合类Gather的声明
class Gather
{public:Gather();//初始化集合 int Length(); //求单链表的长度void PrintList();//遍历bool Locate(char ch);//按值查找 bool Insert(char ch);//插入操作char Get(int i);//按位查找 void JiaoJi(Gather B);//求交集void BingJi(Gather B);//求并集 void ChaJi(Gather B);//求差集 void Save(ofstream &fp);//保存 void Read(ifstream &fp);//读取 void Equal(Gather B);//判断是否相等void Subset(ofstream &fp);//求子集 private:Node *first;
};#endif

(2) Gather.cpp

//Gather.cpp
#include<iostream>
#include <fstream>
#include"Gather.h"
#include<math.h>
using namespace std;//初始化空集合
Gather::Gather()
{first=new Node;first=NULL;
}//求单链表的长度
int Gather::Length()
{struct Node *p=first;int count=0;while(p!=NULL){p=p->next;count++;}return count;
}//遍历
void Gather::PrintList()
{struct Node *p=first;while(p!=NULL){cout<<p->data<<" ";p=p->next;}cout<<endl;
}//按值查找
bool Gather:: Locate(char ch)
{struct Node *p=first;while(p!=NULL){if(p->data==ch) return true;p=p->next;}return false;
}//插入操作
bool Gather::Insert(char ch)
{Node *p=first,*s=NULL; if(first==NULL){first=new Node;first->data=ch;first->next=NULL;return true;}else{while(p->next!=NULL){p=p->next;}s=new Node;s->data=ch;s->next=p->next;p->next=s; return true;}
}//按位查找char Gather::Get(int i){Node *p=this->first;int count=0;while(p!=NULL&&count<i){p=p->next;count++;} if(p==NULL) throw"查找位置错误";else return p->data;}//求交集
void Gather::JiaoJi(Gather B)
{Gather C;Node *p=this->first;while(p!=NULL){char ch=p->data;if(B.Locate(ch)&&!C.Locate(ch)) C.Insert(ch);p=p->next;}C.PrintList();//将结果保存到文件JiaoJiofstream fc("JiaoJi.txt");C.Save(fc);fc.close();cout<<endl;
}//求并集
void Gather::BingJi(Gather B)
{Gather C;Node *p=this->first;while(p!=NULL){char ch=p->data;if(!C.Locate(ch)) C.Insert(ch);p=p->next;}Node *q=B.first;while(q!=NULL){char ch=q->data;if(!C.Locate(ch)) C.Insert(ch);q=q->next;}C.PrintList();//将结果保存到文件BingJiofstream fc("BingJi.txt");C.Save(fc);fc.close();cout<<endl;
}//求差集
void Gather::ChaJi(Gather B)
{Gather C;Node *p=this->first;while(p!=NULL){char ch=p->data;if(!B.Locate(ch)&&!C.Locate(ch)) C.Insert(ch);p=p->next;}C.PrintList();//将结果保存到文件ChaJiofstream fc("ChaJi.txt");C.Save(fc);fc.close();cout<<endl;
}//保存
void Gather::Save(ofstream &fp)
{Node *p=this->first;while(p!=NULL){fp<<p->data<<" ";p=p->next; }fp.close();
} //读取
void Gather::Read(ifstream &fp)
{char name[100];int i=0;  while(fp.peek()!=EOF){fp>>name[i];this->Insert(name[i]);cout<<name[i]<<" ";i++;}
} //判相等
void Gather::Equal(Gather B)
{Node *p=this->first;if(this->Length()==B.Length()){while(p!=NULL){char ch=p->data;if(B.Locate(ch)) p=p->next;else{cout<<"集合A与集合B不相等!"<<endl;return;}}cout<<"集合A与集合B相等!"<<endl;}else{cout<<"集合A与集合B不相等!"<<endl; }
} //求子集并保存
void Gather::Subset(ofstream &fp)
{Node *p=this->first;int i,j;int len=this->Length();for(i=(int)pow(2,len)-1;i>=1;i--){int sum=i;for(j=len-1;j>=0;j--){if(sum>=pow(2,j)){cout<<this->Get(len-1-j);fp<<this->Get(len-1-j);sum-=(int)pow(2,j);}}cout<<" ";fp<<" ";}fp.close();cout<<endl;return;
}

(3)主函数文件(运行文件)Gather_main.cpp

//Gather_main.cpp
#include <iostream>
#include <fstream>
#include "Gather.cpp"
using namespace std;int main()
{Gather A;Gather B;char nameA[100];char nameB[100];char word1; cout<<"****************************集合的初始化******************************"<<endl;cout<<"*                                                                    *"<<endl;cout<<"*                         1  从文件读入                              *"<<endl;cout<<"*                         2  从键盘输入                              *"<<endl;cout<<"*                                                                    *"<<endl;cout<<"**********************************************************************"<<endl;cout<<"      请输入1或2进行选择: ";cin>>word1;cout<<endl;switch(word1){case '1':{cout<<"集合A:";ifstream fp1("A.txt");A.Read(fp1);fp1.close();cout<<"\n集合B:"; ifstream fp2("B.txt");B.Read(fp2);fp2.close();cout<<endl;}break;case '2':{cout<<"请输入集合A:"; for(int i=0;i<100;i++){cin>>nameA[i];A.Insert(nameA[i]);if(cin.get()=='\n'){break;}}ofstream f1("A.txt");A.Save(f1);f1.close();cout<<"请输入集合B:"; for(int j=0;j<100;j++){cin>>nameB[j];B.Insert(nameB[j]);if(cin.get()=='\n'){break;}}ofstream f2("B.txt");B.Save(f2);f2.close();}break;}char word2;while(1) { cout<<"****************************集合的运算设计******************************"<<endl;cout<<"*                                                                      *"<<endl;cout<<"*                         1  求交集                                    *"<<endl;cout<<"*                         2  求并集                                    *"<<endl;cout<<"*                         3  求差集                                    *"<<endl;cout<<"*                         4  判相等                                    *"<<endl;cout<<"*                         5  求集合A子集                               *"<<endl;cout<<"*                         6  求集合B子集                               *"<<endl;cout<<"*                         7  退出                                      *"<<endl;cout<<"*                                                                      *"<<endl;cout<<"************************************************************************"<<endl;cout<<"      请输入1~7进行选择: ";cin>>word2;cout<<endl;     switch(word2){case '1':cout<<"A和B的交集:";A.JiaoJi(B);break;case '2':cout<<"A和B的并集:";A.BingJi(B);break;case '3':cout<<"A和B的差集:";A.ChaJi(B);break;case '4':A.Equal(B);cout<<endl;break; case '5':{ofstream fa("Aziji.txt");A.Subset(fa);fa.close();cout<<endl;}break;case '6':{ofstream fb("Bziji.txt");B.Subset(fb);fb.close();cout<<endl;}break;case '7':cout<<"*******************************结束!!!**********************************"<<endl;return 1;default:cout<<"      出错,重新选择!"<<endl;}}return 0;
}

4.运行展示

运行环境:Dev-C++ 5.11

集合的运算(C++单链表实现)相关推荐

  1. 多项式(Polynomial)的运算——利用单链表

    多项式(Polynomial)的运算--利用单链表 1. 多项式的概念 1.1 多项式的定义 有限的单项式之和称为多项式,其中每个单项式叫做多项式的项,不含字母的项叫做常数项. 多项式里,次数最高的项 ...

  2. 【数据结构链表】之五单链表

    一:链表基础 1.链表基础----------------摘录自百度百科 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中 ...

  3. 单链表的定义、特点、结构及其一些基本操作

    一,基本运算 1,单链表,双链表的定义: 设计链式存储结构时,每个逻辑节点存储单独存储. 2,单链表的基本结构:  头节点在前,首节点在后. 3,顺序表与链表间存储密度的差异: 顺序表的存储密度为1, ...

  4. 使用顺序表、单链表求集合运算

    ******.设有两个顺序表A和B,编写一个算法将属于A,但是不属于B的数据元素放大到另一个顺序表C中 (1).算法设计 遍历顺序表A,将A中每一个元素依次与顺序表B比较,如果相等直接跳过开始比较下一 ...

  5. 用单链表的方式实现集合的基本运算(数据结构C语言版)

    ①用单链表来实现结合的基本运算,首先用的是单链表所以我们就先给它创建一个头结点并且为它分配空间,而结点的结构体中定义了两个属性 data域和next指针域. ②实现集合元素的插入.我用的是单链表头插法 ...

  6. 两个有序单链表的并交差运算

    /*实验2.6:求集合(有序单链表表示)的并.交和差运算*/ #include<iostream> #include<malloc.h> using namespace std ...

  7. c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言

    建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...

  8. 创建带头结点单链表实现二进制数加1的运算

    题目描述: 建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位.在此链表上实现对二进制数加1的运算,并输出运算结果. 测试数据1: 1010011 测试数据 ...

  9. c语言单链表的按序号查找,以下为单链表按序号查找的运算,分析算法,请在______处填上正确的语句。 pointer find_lklist(1kl...

    以下为单链表按序号查找的运算,分析算法,请在______处填上正确的语句. pointer find_lklist(1kl 更多相关问题 [单选题]Struts2框架最先加载的配置文件是: A. de ...

最新文章

  1. 解决 Windows instance 时间不同步问题 - 每天5分钟玩转 OpenStack(153)
  2. cdata节 赋值变量_JS原生练习题:第二课第5~12节
  3. Atheros无线网卡芯片全介绍
  4. java读取dcm影像文件_使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像
  5. linux线程同步(1)-互斥量
  6. mysql 商品属性_MySQL产品属性表设计
  7. 有道云笔记到简书的迁移工具
  8. .NET Core WEB API中接口参数的模型绑定的理解
  9. Python 装饰器 函数
  10. mysql获取数据库名_mysql获取数据库名
  11. Python入门6_抽象
  12. python中exit 的作用_Python退出命令-为什么要使用这么多?何时使用每个命令?
  13. 21世纪十大营销法则
  14. shuttle的DSA2LV板子逆向工程完成,Uboot和linux有源码了
  15. 2016年腾讯校招笔试题 详解
  16. mysql学习笔记 51_mysql学习笔记
  17. 绘制神经元的结构模式图,神经元结构示意图简易
  18. 公司邮箱注册申请流程,好用的邮箱功能开启高效办公
  19. 藏着无数秘密:一键查看缩略图文件的神器 Thumbs Viewer
  20. 淘淘商城---8.10

热门文章

  1. python语言语句单词大全及读音_python单词怎么读
  2. NBA名人堂之-威尔特·张伯伦|乔治·迈肯|比尔·沃顿|戴夫·考恩斯|威利斯·里德
  3. win10远程计算机连接打印机共享打印机,win10共享打印机设置连接方法(1分钟学会!)...
  4. 2015阿里校园招聘笔试题(8.29 测试开发工程师)
  5. 给定一个十进制整数, 转成二进制形式,转成十六进制形式。
  6. 【论文解读】利用高光谱图像对场景反射率进行有效估计(Efficient Estimation of Reflectance Parameters from Imaging Spectropy)
  7. 【Html标签学习】表单标签
  8. 1个网卡设置多个IP作用
  9. 辽宁师范大学计算机科学技术与,王相海 - 辽宁师范大学 - 计算机与信息技术学院...
  10. 西乔说要把「神秘的程序员们」当做一个文化产品来做