数据结构课程设计_集合运算(完整)
数据结构 集合运算
数据结构课程设计报告设计题目:集合运算学生姓名:专业:软件工程班级:学号:指导老师:完成日期:合肥工业大学软件学院数据结构与算法课程设计一、需求和规格说明问题描述:设有两个用单链表表示的集合A、B,其元素类型是int且以非递减方式存储,其头结点分别为a、b。
要求下面各问题中的结果集合同样以非递减方式存储,结果集合不影响原集合。
实现要求:⑴编写集合元素测试函数IN_SET,如果元素已经在集合中返回0,否则返回1;⑵编写集合元素输入并插入到单链表中的函数INSERT_SET,保证所输入的集合中的元素是唯一且以非递减方式存储在单链表中;⑶编写集合元素输出函数,对建立的集合链表按非递增方式输出;⑷编写求集合A、B的交C=A∩B的函数,并输出集合C的元素;⑸编写求集合A、B的并D=A∪B的函数,并输出集合D的元素;⑹求集合A与B的对称差E=(A-B)∪(B-A) 的函数,并输出集合D的元素;⑺设计一个菜单,具有输入集合元素、求集合A、B的交C、求集合A、B 的并D、求集合A与B的对称差E、退出等基本的功能。
测试数据:由读者自定,但集合A、B的元素个数不得少于16个。
二、设计1.存储结构链表2.操作函数void creatlist ();创建集合void increaseArray ();递增排序void decreaseArray ();递减排序void showArray ();输出集合void AandB ( list a , list b);交运算void AorB ( list a , list b );并运算void AaddB ( list a , list b);和运算void AsubtractB( list a , list b );集合减运算void symmetricDifference ( list a , list b );对称差运算void AequalB ( list a );复制void INSERT_SET ( );递增储存void DECREASESHOW( );递减输出int IN_SET ( int i );检测是否在集合中,并返回值二、用户手册1.首先先建立两个做实验的集合A和B2.自动显示你所建的集合3.进入选择界面,选择你想要用的功能(数字表示)4.执行功能,输出结果5.自动退出程序四、调试与测试分别展示六个功能1.2.3.4.5.6.五、复杂度分析做的时候没有考虑复杂度问题,主要就是求交集的时候先排序再求交还是先求交集在排序的问题,如果代码是顺序的,可以让求交集这个操作复杂度变成了o(m + n);比先求交在排序复杂度低很多。
数据结构课程设计_集合的并、交和差运算
数据结构课程设计学院:信息科学与工程学院专业:计算机科学与技术班级:学号:学生姓名:指导教师:2009 年12 月25 日一、实验内容实验题目:编制一个演示集合的并、交和差运算的程序。
需求分析:1、本演示程序中,集合的元素限定为小写字母字符[“a”…”z”]。
集合输入的形式为一个以“回车符“为结束标志的字符串,串中字符顺序不限。
2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息“之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
3、程序执行的命令包括:1)构造集合1;2)构造在集合2;3)求并集;4)求交集;5)求差集;6)返回;7)结束。
“构造集合1”和“构造集合2”时,需以字符的形式键入集合元素。
二、数据结构设计为了实现上述程序的功能,应以有序链表表示集合。
为此,需要两个抽象数据类型:有序表和集合。
1、有序表的抽象数据类型定义为:readdata(pointer head)初始条件:head是以head为头节点的空链表。
操作结果:生成以head为头节点的非空链表。
pop(pointer head)初始条件:head是以head为头节点的非空链表。
操作结果:将以head为头节点的链表中数据逐个输出。
2、集合的抽象数据类型定义为:and(pointer head1,pointer head2,pointer head3)初始条件:链表head1、head2、head3已存在操作结果:生成一个由head1和head2的并集构成的集合head3。
or(pointer head1,pointer head2,pointer head3)初始条件:链表head1、head2、head3已存在操作结果:生成一个由head1和head2的交集构成的集合head3。
differ(pointer head1,pointer head2,pointer head3)初始条件:链表head1、head2、head3已存在操作结果:生成一个由head1和head2的差集构成的集合head3。
集合的基本运算课程设计
集合的基本运算课程设计一、课程目标知识目标:1. 让学生掌握集合的基本运算概念,包括并集、交集、差集和补集。
2. 使学生能够理解和运用集合的运算法则,正确进行集合运算。
3. 让学生理解集合运算在数学及现实生活中的应用。
技能目标:1. 培养学生运用集合运算解决问题的能力,提高逻辑思维和分析能力。
2. 培养学生运用数学语言准确描述集合运算过程,提高表达和沟通能力。
情感态度价值观目标:1. 激发学生对集合运算的兴趣,培养数学学习的积极性。
2. 培养学生合作学习、共同探讨的良好学习习惯,增强团队协作意识。
3. 使学生认识到集合运算在解决实际问题中的价值,提高对数学实用性的认识。
课程性质分析:本课程为数学学科的基础内容,是中学数学的重要组成部分。
集合的基本运算对于培养学生的逻辑思维、抽象思维和解决问题能力具有重要意义。
学生特点分析:本课程面向初中年级学生,该阶段学生具有一定的数学基础,但逻辑思维和抽象思维能力尚需提高。
学生好奇心强,喜欢探索新知识,但学习自觉性有待加强。
教学要求:1. 注重启发式教学,引导学生主动参与课堂,激发学习兴趣。
2. 结合实际例子,讲解集合运算的原理和应用,提高学生的理解能力。
3. 设计丰富的课堂练习,巩固所学知识,提高学生的运用能力。
4. 关注学生个体差异,因材施教,使每个学生都能在课程中收获成长。
二、教学内容1. 集合的基本概念复习:回顾集合的定义、元素的性质以及集合的表示方法。
2. 并集的定义与运算:介绍并集的概念,讲解如何求两个集合的并集,包括图形表示和符号表示。
3. 交集的定义与运算:阐述交集的含义,通过实例演示如何进行集合的交集运算。
4. 差集的定义与运算:解释差集的概念,举例说明如何计算两个集合的差集。
5. 补集的定义与运算:引入补集的概念,讨论在全集给定的情况下如何找到集合的补集。
6. 集合运算的性质:总结并讲解集合运算的基本性质,如交换律、结合律等。
7. 集合运算的应用:通过实际例题,展示集合运算在解决实际问题中的应用。
数据结构课程设计_集合运算(完整).
电子与信息工程学院数据结构实验报告实验名称: 集合的运算实验类型:设计(验证、设计、创新)班级: 2013级电信三班学号: 201307014327 姓名:陆杰实验时间:2015 年 6 月16 日指导教师:余先伦成绩:目录一课程设计目的和要求二问题描述及分析三算法思想和程序的实现概述3.1 算法思想3.2 程序的实现概述四程序流程图流程图五程序的实现5.1 主函数5.2 链表的生成5.3 集合的输出5.4 并运算函数5.5交运算函数5.6 差函数六运行结果分析6.1 程序主界面6.2整数集合并运算6.3 整数集合交运算6.4 整数集合差运算6.5 字母集合并运算6.6 字母集合交运算6.7 字母集合差运算6.8 字母和数据集合并运算6.9 字母和数据集合交运算6.10 字母和数据集合差运算6.11 退出程序七源代码八总结九参考文献一课程设计目的和要求目的:深入理解数据结构的基本理论,掌握数据存储结构的设计方法,掌握基于数据结构的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。
在实践中培养独立分析问题和解决问题的作风和能力。
要求:熟练运用C++语言、基本数据结构和算法的基础知识,独立编制一个具有中等难度的、解决实际应用问题的应用程序。
通过题意分析、选择数据结构、算法设计、编制程序、调试程序、软件测试、结果分析、撰写课程设计报告等环节完成软件设计的全过程,不断地完善程序以提高程序的性能。
二问题描述及分析问题描述:本课程设计中,集合的元素可以是字母[a,b,…z],也可以是整数[0,1,…9],集合的大小集合输入的形式为一个以“回车符”为结束标志的字符,允许出现重复字符或非法字符,程序应能自动滤去。
输出的运算结果字符串中将不含重复字符或非法字符。
问题描述:有两个集合A、B,要求它的交集、并集和差集C。
用两个链表p、q存储集合A、B,用链表r存储集合C。
数据结构与数据库实验一集合的运算
数据结构与数据库实验仅供参考实验一集合的表示及运算实验名称:集合的表示及运算专业:电气工程姓名:学号:集合的表示及运算一、实验要求1.程序的功能:实现集合的交、并、判断相等运算。
2.输入输出的要求:设计的数据结构应有利于表示任意个数元素组成的集合。
3.测试数据。
(1) {a, b, c}, {b, c, d}(2) {a, b,c}, {x, y}(3) { }, {x, y}(4) {a, x, b}, {a, x, b}二、概要设计1.采用的数据结构的定义及主要功能模块的功能:在本实验中,数据的存储采用数组连续存储方式。
由于本实验相对简单,功能相对较少,只是针对数组进行交并等基础性操作,所以本实验中只采用了函数模板,这样比结构体、类以及类模板都更加简洁、易懂,也更有利于实现对多种数据类型的数据进行操作。
而且,为了满足设计的数据结构应有利于表示任意个数元素组成的集合,在本实验中采用由用户自己输入所需存储空间的最大长度,动态分配所需存储空间。
由于含有动态生成的数据成员,必须自定义析构函数以释放动态分配的内存,本实验中的析构函数为Delete(T*,T*)。
字符串的比较采用string类2、各个函数模板的声明及其功能如下:1、判断集合是否相等的运算:template<typename T>void deng_array(T*A,T*B,int A_mm,int B_mm);//A、B为需要进行判断是否相等的数组,A_mm、B_mm 分别为数组A、B的最大存储空间,由用户在输入数组数据时确定并输入,算法根据用户输入的数据动态建立相应的存储空间。
以下各形式参量的意义均与此相同。
2、集合的交运算:template<typename T>void jiao_array(T*A,T*B,int A_mm,int B_mm);3、集合的并运算:template<typename T>void bing_array(T*A,T*B,int A_mm,int B_mm);4、析构函数:template<typename T>void Delete(T*A,T*B);//释放动态分配的内存5、字符串的交运算template <typename T>string jiao_string(T & A,T &B);6、字符串的并运算template <typename T>string jiao_string(T & A,T &B);7、判断字符串是否相等:采用string中的’=‘if(A==B)cout<<"EQUAL"<<endl;cout<<"NOT EQUAL"<<endl;三、详细设计1、各模块的流程图:1、判断集合是否相等的运算:2、集合的交运算:3、集合的并运算:4、析构函数:释放动态分配的内存:delete[]A;delete[]B;5、字符串的交运算6、字符串的并运算四、调试分析1、在本实验中,集合的数据类型可以实现字符型、整型,用户可根据系统提示进行选择。
集合的运算课程设计报告
集合的运算课程设计报告一、课程目标知识目标:1. 理解集合的基本概念,掌握集合的表示方法;2. 掌握集合的交集、并集、差集和对称差集的运算规则;3. 能够运用集合运算解决实际问题,如集合的包含关系、集合的等价关系等。
技能目标:1. 能够运用集合表示法准确地描述问题中的集合;2. 能够熟练地进行集合的交集、并集、差集和对称差集的运算;3. 能够运用集合运算解决实际问题,培养逻辑思维和问题解决能力。
情感态度价值观目标:1. 培养学生对集合概念的兴趣,激发学习数学的热情;2. 培养学生严谨的思考习惯,增强解决问题的自信心;3. 培养学生合作交流的意识,提高团队协作能力。
本课程针对年级特点,注重启发式教学,结合实际生活中的例子,让学生在实际问题中体会集合运算的实用性和趣味性。
通过本课程的学习,使学生掌握集合运算的基本知识,提高解决问题的能力,培养数学思维和合作精神。
教学过程中,将课程目标分解为具体的学习成果,便于后续教学设计和评估。
二、教学内容1. 集合的基本概念及表示方法- 集合的定义与性质- 集合的表示方法(列举法、描述法、图示法等)2. 集合的运算规则- 交集的定义与性质- 并集的定义与性质- 差集的定义与性质- 对称差集的定义与性质3. 集合运算的应用- 集合包含关系- 集合等价关系- 集合运算在实际问题中的应用4. 教学内容的安排与进度- 第一课时:集合的基本概念及表示方法- 第二课时:交集、并集的定义与性质- 第三课时:差集、对称差集的定义与性质- 第四课时:集合运算的应用及综合练习教学内容依据课程目标,结合教材相关章节,注重科学性和系统性。
在教学过程中,教师需引导学生通过实例理解集合的概念,掌握集合的表示方法,并学会运用集合运算规则解决实际问题。
教学内容按照教学大纲逐步展开,确保学生能够扎实掌握集合运算的相关知识。
三、教学方法本课程采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过生动的语言和形象的表达,讲解集合的基本概念、表示方法以及运算规则。
数据结构课程设计_集合运算
数据结构课程设计_集合运算在计算机科学中,数据结构是组织和存储数据的方式,以便能够有效地对其进行操作和处理。
集合运算是数据结构课程中的一个重要部分,它涉及到对集合的各种操作,如并集、交集、差集等。
这些运算在许多实际应用中都有着广泛的用途,例如数据库管理、图像处理、算法设计等。
集合是由一组无序且唯一的元素组成的。
在编程中,我们可以使用不同的数据结构来实现集合,如数组、链表、哈希表等。
每种数据结构都有其特点和适用场景,选择合适的数据结构对于高效地执行集合运算至关重要。
让我们先来了解一下并集运算。
并集是指将两个集合中的所有元素合并在一起,去除重复的元素,得到一个新的集合。
例如,集合 A ={1, 2, 3},集合 B ={3, 4, 5},那么 A 和 B 的并集就是{1, 2, 3, 4, 5}。
在实现并集运算时,我们可以遍历两个集合,将元素依次添加到一个新的集合中。
在添加过程中,通过检查新集合中是否已经存在该元素来避免重复。
接下来是交集运算。
交集是指两个集合中共同拥有的元素所组成的集合。
对于上面的集合 A 和 B,它们的交集就是{3}。
实现交集运算时,我们可以同时遍历两个集合,只有当元素同时存在于两个集合中时,才将其添加到交集集合中。
差集运算则是从一个集合中去除另一个集合中的元素。
比如集合 A B 表示从集合 A 中去掉集合 B 中的元素,结果为{1, 2}。
在实现差集运算时,我们遍历第一个集合,对于每个元素,如果它不在第二个集合中,就将其添加到差集集合中。
在实际编程中,我们需要根据具体的问题和数据特点来选择合适的算法和数据结构来实现这些集合运算。
例如,如果集合中的元素数量较少,使用数组来存储集合可能是一个简单有效的选择。
但如果集合中的元素数量较大,且元素的值范围较广,哈希表可能是更好的选择,因为它可以提供更快的查找和插入操作。
为了更清晰地理解集合运算的实现,我们可以通过一个具体的例子来看看。
假设我们有两个学生名单集合,一个是参加数学竞赛的学生集合,另一个是参加物理竞赛的学生集合。
《数据结构》课程设计
《数据结构》课程设计一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中基础的数据组织、管理和处理方法,培养其运用数据结构解决实际问题的能力。
课程目标如下:1. 知识目标:(1)理解基本数据结构的概念、原理和应用,如线性表、栈、队列、树、图等;(2)掌握常见算法的设计和分析方法,如排序、查找、递归、贪心、分治等;(3)了解数据结构在实际应用中的使用,如操作系统、数据库、编译器等。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,具备良好的编程实践能力;(2)掌握算法分析方法,能够评价算法优劣,进行算法优化;(3)能够运用数据结构进行问题建模,提高问题解决效率。
3. 情感态度价值观目标:(1)激发学生对计算机科学的兴趣,培养其探索精神和创新意识;(2)培养学生团队合作意识,学会与他人共同解决问题;(3)增强学生的责任感和使命感,使其认识到数据结构在信息技术发展中的重要性。
本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,为后续教学设计和评估提供依据。
课程注重理论与实践相结合,旨在提高学生的知识水平、技能素养和情感态度价值观。
二、教学内容《数据结构》教学内容依据课程目标进行选择和组织,确保科学性和系统性。
主要包括以下部分:1. 线性表:- 线性表的定义、特点和基本操作;- 顺序存储结构、链式存储结构及其应用;- 线性表的相关算法,如插入、删除、查找等。
2. 栈和队列:- 栈和队列的定义、特点及基本操作;- 栈和队列的存储结构及其应用;- 栈和队列相关算法,如进制转换、括号匹配等。
3. 树和二叉树:- 树的定义、基本术语和性质;- 二叉树的定义、性质、存储结构及遍历算法;- 线索二叉树、哈夫曼树及其应用。
4. 图:- 图的定义、基本术语和存储结构;- 图的遍历算法,如深度优先搜索、广度优先搜索;- 最短路径、最小生成树等算法。
5. 排序和查找:- 常见排序算法,如冒泡、选择、插入、快速等;- 常见查找算法,如顺序、二分、哈希等。
(完整word版)数据结构课程设计_集合的并、交和差运算(word文档良心出品)
一、课程题目会合的并、交和差运算二、问题描绘功能:编制一个能演示履行会合的并、交和差运算的程序。
三、基本要求1)会合的元素限制为小写字母字符【‘ a’ ..‘ z’】2)演示程序以用户和计算机的对话方式履行。
四、测试数据(1) Set1= ”magazine ” , Set2= ’ paper ” ,Set1∪Set2= ”aegimnprz ” ,Set1∩Set2= ”ae” ,Set1-Set2=”gimnz”;(2) Set1= ” 012oper4a6tion89 ”,Set2= ”error data ” , Set1 ∪Set2= ” adeinoprt ” ,Set1 ∩Set2= ” aeort ” , Set1-Set2= ” inp ” .五、算法思想为了实现上述程序的功能,应以有序链表表示会合。
为此,需要两个抽象数据种类:有序表和会合。
1、有序表的抽象数据种类定义为:input(linklist l)初始条件: l 是以 l 为头节点的空链表。
操作结果:生成以l 为头节点的非空链表。
output(linklist l)初始条件: l 是以 l 为头节点的非空链表。
操作结果:将以l 为头节点的链表中数据逐一输出。
2、会合的抽象数据种类定义为:heji(linklist A,linklist B,linklist C)初始条件:链表A、B、C 已存在操作结果:生成一个由 A 和 B 的并集组成的会合C。
jiaoji(linklist A,linklist B ,linklist ,C)初始条件:链表A、B、C 已存在操作结果:生成一个由 A 和 B 的交集组成的会合C。
六、模块化分本程序抱含四个模块:1)节点构造单元模块——定义有序表的节点构造;2)有序表单元模块——实现有序表的抽象数据种类;3)会合单元模块——实现会合获取抽象数据种类;4)主程序模块:Void main () {初始化;do{接授命令;办理命令;}while (“命令” != “退出”);}七、源程序#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>typedef struct node{int data;struct node* next;}lnode,*linklist;lnode *init_lnode();void input(linklist l);void jiaoji(linklist A,linklist B,linklist C); void heji(linklist A,linklist B,linklist C); void output(linklist l);void main(){lnode *a,*b,*c;a=init_lnode();b=init_lnode();c=init_lnode();printf(" 求 AB 会合的交集和并集\n");printf(" 请输入 A 会合的元素 :");input(a);printf("\n 请输入 B 会合的元素 :");input(b);printf("\n 输入达成 \n");printf("\n 按随意键进入主菜单:");getch();do{char menu[]={"\n\n\n-----☆ 1.交集运算☆---------\n\n""--------- ☆ 2 和集运算☆ ---------\n\n""--------- ☆3.差集运算☆---------\n\n""--------- ☆ 0.退出☆ ---------\n\n" };printf("%s",menu);printf("\n 请在 0-3 中选择 :");scanf("%d",&sel);switch(sel){case 1:printf("AB会合的交集是:");jiaoji(A,B,C);output(C);C->next=NULL;break;case 2:printf("AB的合集是:");heji(A,B,C);output(C);C->next=NULL;break;case 3:chaji(A,B,C);break;case 0:break;}}while(sel!=0);}/* 主函数结束 */ /**********初始化函数 ***************/lnode * init_lnode(){lnode *l;l=(lnode *)malloc(sizeof(lnode));l->next=NULL;return l;}/***************录入函数 ********************/ void input(linklist l){lnode *s;int x;scanf("%d",&x);while(x!=0){s=(lnode *)malloc(sizeof(lnode));s->data=x;s->next=l->next;l->next=s;scanf("%d",&x);}}/************交集函数 *********************/ void jiaoji(linklist A,linklist B,linklist C){lnode *p,*q,*t;p=A->next;while(p!=NULL){q=B->next;while((q!=NULL)&&(q->data!=p->data))q=q->next;if((q!=NULL)&&(q->data==p->data)){t=(lnode*)malloc(sizeof(lnode));t->data=p->data;t->next=C->next;C->next=t;}p=p->next;}}/***********输出函数 *****************/void output(linklist l){lnode *s;s=l->next;while(s!=NULL){printf("%5d",s->data);s=s->next;}printf("\n");}/******** 并集函数 *************************/ void heji(linklist A,linklist B,linklist C){lnode *p,*q,*t;p=A->next;while(p!=NULL){t=(lnode*)malloc(sizeof(lnode));t->data=p->data;t->next=C->next;C->next=t;p=p->next;}q=B->next;while(q!=NULL){p=A->next;while((p!=NULL)&&(p->data!=q->data))p=p->next;if (p==NULL){t=(lnode*)malloc(sizeof (lnode));t->data=q->data;t->next=C->next;C->next=t;}q=q->next;}/*********************差集函数 ****************/ void chaji(linklist A,linklist B, linklist C){lnode *p,*q,*s,*t;p=A->next;printf("A与B的差集是:\n");while(p!=NULL){q=B->next;while((q!=NULL)&&(p->data!=q->data))q=q->next;if(q==NULL){s=(lnode*)malloc(sizeof(lnode));s->data=p->data;s->next=C->next;C->next=s;}p=p->next;}output(C);C->next=NULL;q=B->next;printf("B 与 A 的差集是 :\n");while(q!=NULL){p=A->next;while((p!=NULL)&&(p->data!=q->data)) p=p->next;if(p==NULL){t=(lnode*)malloc(sizeof(lnode));t->data=q->data;t->next=C->next;C->next=t;}q=q->next;}output(C);}} 四、测试数据及程序运转状况程序运转结果 :八、心得领会1、因为对会合的三种运算的算法斟酌不足,在链表种类及其尾指针的设置时出现错误,以致程序低效。
集合的并交差运算数据结构课程设计
集合的并交差运算数据结构课程设计#include<string.h>#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define INFEASIBLE -1#define OVERFLOW -2#define NULL 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int Status;typedef char ElemType;typedef struct{ElemType *elem;int length;int listsize;}SqList;Status InitList(SqList &l){l.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!l.elem) exit(OVERFLOW);l.length=0;l.listsize=LIST_INIT_SIZE;return OK;}int ListLength(SqList l){return(l.length);}Status ListInsert_Sq(SqList &L,int i, ElemType e){//在顺序表L的第i个位置前插入元素e,i的合法值为1..L.length+1 if(i<1||i>L.length+1)return ERROR;if(L.length>=L.listsize){ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}ElemType *q=&L.elem[i-1], *p=&L.elem[L.length-1];while(p>=q){*(p+1)=*p; --p;} //插入位置后的元素右移*q=e;++L.length;return OK;}Status CreatSqList(SqList &l,ElemType a[],int n){int len=ListLength(l);for(int i=0;i<n;i++){if(a[i]>='a'&&a[i]<='z') ListInsert_Sq(l,++len,a[i]);}return OK;}Status GetElem(SqList L,int i,ElemType &e){if(i<=0||i>L.length)return ERROR;elsee=*(L.elem+i-1);return OK;}Status equal(ElemType e1,ElemType e2){if(e1==e2)return TRUE;elsereturn FALSE;}int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType,ElemType)){ElemType *p=L.elem; //p指向第一个元素int i=1; //i始终为p所指向元素的位序while(i<=L.length&&!(*compare)(*p++,e))++i;if(i<=L.length)return(i);elsereturn 0;}Status ListDelete(SqList &L,int i,ElemType &e) {//在顺序表L中删除第i个元素,用e返回其值.if(i<1||i>L.length)return ERROR;//删除位置不合理ElemType *p=&L.elem[i-1],*q=L.elem+L.length-1; e=*p;while(p<q){*p=*(p+1); ++p;} //删除位置后的元素左移--L.length;return OK;}void Union(SqList &La,SqList Lb){//将所有在线性表Lb中而不在La中的元素插入Laint la_len , lb_len;ElemType e;la_len=ListLength(La);lb_len=ListLength(Lb);for(int i=1;i<=lb_len;++i){GetElem(Lb,i,e);if(LocateElem_Sq(La,e,equal)==0)ListInsert_Sq(La,++la_len,e);}}Status JiaoJi(SqList l1,SqList l2, SqList &l3) {int l1_len, l2_len,l3_len,i=1,j=1;ElemType e,u;l1_len=ListLength(l1);l2_len=ListLength(l2);l3_len=ListLength(l3);for(i=1;i<=l1_len;i++){GetElem(l1,i,e);for(j=l2_len;j>=1;j--){GetElem(l2,j,u);if(e==u){ListInsert_Sq(l3,++l3_len,u);break;}elsecontinue;}}return OK;}Status ChaJi(SqList &l1,SqList l2) {SqList lc;int count=0,lc_len,l1_len,l2_len; ElemType e,u,f;InitList(lc);JiaoJi(l1,l2,lc);lc_len=ListLength(lc);l1_len=ListLength(l1);l2_len=ListLength(l2);for(int i=1;i<=lc_len;i++) {GetElem(lc,i,e);for(int j=1;j<=l1_len;j++) {GetElem(l1,j,u);if(u==e){ListDelete(l1,j,f);}}}return OK;}void Outputlist(SqList &L){if(0==L.length)printf("空集!");elsefor(int i=0;i<L.length;++i){printf("%c",*(L.elem+i));}}void main(){system("@title 集合的并交叉运算");for(1;;){system("color a1");int c;printf("********************************************************************\n");printf(" ######## 执行程序: 1 ######## 退出程序: 2\n");printf("***************************************************** ***************\n");printf("请按键选择: ");scanf("%d",&c);getchar();printf("\n");if(c==1){SqList l1,l2,l3,la;int n1,n2,i,j;char a1[30], a2[30];InitList(l1);InitList(l2);InitList(l3);InitList(la);printf("请输入第一个集合: ");gets(a1);n1=strlen(a1);for(i=n1-1;i>=0;i--) //从最后一个开始依次与前面的比较重复赋值为0{for(j=0;j<i;j++){if(a1[j]==a1[i])a1[i]=0;}}CreatSqList(l1,a1,n1);la=l1;printf("请输入第二个集合: "); gets(a2);n2=strlen(a2);for(i=n2-1;i>=0;i--) //同上{for(j=0;j<i;j++){if(a1[j]==a1[i])a1[i]=0;}}CreatSqList(l2,a2,n2);printf("集合的交集是: ");JiaoJi(l1,l2,l3);Outputlist(l3);printf("\n");printf("集合的并集是: ");Union(l1,l2);Outputlist(l1);printf("\n");printf("集合的差集是: ");ChaJi(la,l2);Outputlist(la);printf("\n\n**********************按任意键清屏!*************************");system("pause>null");system("cls");}elseexit(0);}}。
数据结构集合运算
数据结构集合运算第一点:集合的基本概念及运算集合是数学中的一种基本概念,它是由一些确定的、互不相同的对象构成的整体。
我们通常用大括号{}或者集合的符号表示集合,例如A = {1, 2, 3}。
集合中的元素是无序的,也就是说,集合中的元素顺序是不重要的。
集合的运算主要包括并集、交集、差集和补集等。
下面我们来一一介绍这些运算。
1.1 并集并集是指两个集合中所有元素的总和,用符号∪表示。
如果集合A = {1, 2, 3}和集合B = {3, 4, 5},那么它们的并集A ∪ B就是{1, 2, 3, 4, 5}。
并集的性质包括:•交换律:A ∪ B = B ∪ A•结合律:(A ∪ B) ∪ C = A ∪ (B ∪ C)1.2 交集交集是指两个集合中共有的元素,用符号∩表示。
如果集合A = {1, 2, 3}和集合B = {3, 4, 5},那么它们的交集A ∩ B就是{3}。
交集的性质包括:•交换律:A ∩ B = B ∩ A•结合律:(A ∩ B) ∩ C = A ∩ (B ∩ C)•空集性质:A ∩ ∅ = ∅,∅∩ A = ∅1.3 差集差集是指一个集合中不属于另一个集合的元素,用符号-表示。
如果集合A = {1, 2, 3}和集合B = {3, 4, 5},那么它们的差集A - B就是{1, 2}。
差集的性质包括:•交换律:A - B = B - A•结合律:(A - B) - C = A - (B - C)补集是指在全集之外不属于某个集合的元素,用符号∁表示。
如果集合A = {1, 2, 3},全集是U = {1, 2, 3, 4, 5},那么集合A的补集∁A就是{4, 5}。
补集的性质包括:•交换律:∁A = ∁∁A•结合律:(∁A) ∪ (∁B) = ∁(A ∩ B),(∁A) ∩ (∁B) = ∁(A ∪ B)第二点:集合运算的应用集合运算在数学中有着广泛的应用,尤其在组合数学、图论、概率论等领域中,集合运算是非常重要的工具。
集合的并,交和差运算数据结构C 课程设计
数据结构C++课程设计题目: 集合的并、交和差运算一、设计题目集合的并、交和差运算二、小组成员分工说明一个人三、需求分析1)运行环境(软、硬件环境)软件环境:Microsoft Vista操作系统,Visual C++ 6.0硬件环境:2.0GB内存2)输入的形式和输入值的范围运行所给的测试数据,集合的元素限定为小写字符〔a. .z〕:第一组: Set1=magazine ,Set2=paper第二组: Set1=0120per4a6tion89,Set2=error data输出的形式描述程序运行并、交和差运算后得到数据,输出字符。
3)功能描述能演示执行集合的并、交和差运算。
4)测试数据(1) Set1=magazine ,Set2=paper,Set1∪Set2=aeginmprz,Set1∩Set2=ae,Set1-Set2=gimnz。
(2) Set1=0120per4a6tion89,Set2=error data,Set1∪Set2=adeinoprt,Set1∩Set2=aeort,Set1-Set2=inp。
四、概要设计1)抽象数据类型定义描述(顺序表的抽象数据类型描述)ADT Seqlist isData线性表的长度OperationSeqlist初始化值:无动作:置顺序表的长度为0Length输入:无前置条件:表已存在功能:求表的长度输出:返回表的长度,即表中数据元素的个数后置条件:表不变Get输入:元素的序号i前置条件:表已存在,i合法功能:在表中取序号为i的数据元素输出:若i合法,返回序号为i的元素值,否则抛出异常后置条件:表不变Locate输入:数据元素item前置条件:表已存在功能:在线性表中查找值等于item的元素输出:若查找成功,返回x在表中的序号,否则返回0 后置条件:表不变Insert输入:插入位置i;待插元素item前置条件:表已存在,i合法功能:在表的第i个位置处插入一个新元素x输出:若插入不成功,抛出异常后置条件:若插入成功,表中增加一个新元素Delete输入:删除位置i前置条件:表已存在功能:删除表中的第i个元素输出:若删除成功,返回被删元素,否则抛出异常后置条件:若删除成功,表中减少一个元素Empty输入:无前置条件:表已存在功能:判断表是否为空输出:若是空表,返回1,否则返回0后置条件:表不变Clear输入:无前置条件:无功能:清空顺序表输出:无后置条件:表的长度是0end ADT seqList2)功能模块设计(如主程序模块设计)集合的并、交和差运算集合的并运算集合的交运算集合的差运算3)模块层次调用关系图mainbin jiao cha五、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。
数据结构课设报告_集合的并、交和差运算的程序
目录1.需求分析 11.1问题描述: 11.2基本要求: 11.3测试数据: 12.概要设计 12.1.集合的数据类型定义为: 12.2.各种函数的功能: 23.详细设计 24.编码实现 45.调试分析 65.1程序运行界面如下图: 65.2遇到的问题以及解决方法: 76.课设总结 77.参考文献 81.需求分析1.1问题描述:编制一个能演示执行集合的并、交和差运算的程序。
1.2基本要求:⑴集合的元素限定为小写字母符[′a′….′z ′],集合的大小n<27。
⑵集合输入的形式为一个以"回车符"为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序应能自动滤去。
⑶输出的运算结果字符串中将不含重复字符或非法字符。
⑷演示程序以用户和计算机的对话方式执行。
1.3测试数据:(1)输入集合个数为2,分别为{a,b,e,d,f},{c,f,g,n},选择集合运算类型为求集合的交集。
(2)输入集合个数为3,分别为{a,b,c},{g,h,n,k},{k,z,a},选择运算类型为求集合的并集。
(3)输入集合个数为2,分别为{b,c,d},{c,d,f,},选择运算类型为集合的差(4)输入集合个数为2,分别为{a,b,x,&,1,3,4},{a,b,c,f,g,1,4},选择集合的运算类型为集合的并集。
2.概要设计2.1.集合的数据类型定义为:struct Set{int num;bool hash[30];}num为集合的元素个数hash为利用哈希表,用来储存集合的元素。
2.2.各种函数的功能:1.void InitSet(Set &Res)操作结果:初始化集合的函数,函数参数为引用类型。
2.Set DealSet(char *s)初始条件:指针s不为空操作结果:将字符串处理成集合,生成的集合为函数返回值。
3.void PriSet(Set s)操作结果:打印集合s。
集合运算课程设计报告
计算机系信管专业数据结构课程设计题目:集合运算班级:信管11101班姓名:学号:201117020127 同组人姓名:起迄日期:2012-12-24—2012-12-28课程设计地点: E3-A512指导教师:完成日期:2012年12月28日目录一、需求分析 (3)1、程序的实现 (3)(1)功能 (3)(2)实施 (3)2、设计的要求 (3)二、概要设计 (3)1、问题分析 (3)2、模块结构 (4)(1)结构分析 (4)(2)结构分析图 (4)三、详细设计 (5)1、解题思路 (5)(1)数据结构设计 (5)(2)逻辑结构存储结构 (5)2、算法设计 (5)四、调试分析和测试结果 (6)1、模块分析 (6)(1)定义单链表结点类型 (6)(2)运用尾插法建立单链表 (6)(3)建立有序链表 (6)2、结果分析 (7)五、总结 (8)1、解决的问题 (8)(1)集合的运算算法 (8)(2)解决方式 (9)2、心得体会 (9)六、参考文献(资料不得少于5篇) (9)七、致谢 (9)八、附录(含程序源码) (10)一、需求分析1、程序的实现(1)功能使用链表来表示集合,完成集合的合并,求交集等操作。
(2)实施1)初步完成总体设计,搭好框架,确定函数个数;2)完成最低要求;3)继续完成进一步要求。
2、设计的要求(1)界面友好,函数功能要划分好;(2)总体设计应画流程图;(3)程序要加必要的注释;(4)要提供程序测试方案;(5)程序要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
二、概要设计1、问题分析该问题主要实现以下功能:(1)利用尾插法建立单链表;(2)对于输入的链表进行有序排列(3)删除有序链表中不符合要求的元素(4)调用函数对单链表进行交、并运算并输出2、模块结构(1)结构分析程序以用户和计算机的对话方式执行,即在计算及终端显示提示信息之后,由用户在键盘输入演示程序中规定的运算命令;相应的输入数据(过滤输入中的非法字符)和运算结果闲时间在其后。
集合的基本运算课程设计
集合的基本运算课程设计一、课程目标知识目标:1. 让学生掌握集合的基本运算,包括并集、交集、差集和补集的定义及其性质;2. 使学生能够运用韦恩图展示集合间的关系,解决相关问题;3. 让学生理解集合运算在现实生活中的应用,如集合的交集和并集在兴趣班报名、活动组织等方面的应用。
技能目标:1. 培养学生运用集合运算解决实际问题的能力;2. 培养学生运用韦恩图分析、解决问题的能力;3. 提高学生的逻辑思维能力和抽象思维能力。
情感态度价值观目标:1. 激发学生对数学学习的兴趣,培养他们的学习积极性;2. 培养学生合作交流的意识,学会倾听、表达和尊重他人意见;3. 使学生认识到集合运算在生活中的重要性,增强他们学以致用的意识。
课程性质:本课程为数学学科的基础课程,旨在帮助学生掌握集合的基本运算,培养他们的逻辑思维和实际问题解决能力。
学生特点:学生处于初中阶段,具有一定的数学基础和抽象思维能力,但需加强在实际问题中的应用。
教学要求:教师需结合生活实例,引导学生通过实践、探究和讨论,掌握集合的基本运算,达到学以致用的目的。
同时,注重培养学生的合作交流能力和逻辑思维能力。
在教学过程中,关注学生的学习进度,及时调整教学策略,确保课程目标的实现。
通过课程学习,学生能够具备解决实际问题的能力,提高数学素养。
二、教学内容本节教学内容以人教版初中数学教材中集合的基本运算为主题,包括以下几部分:1. 集合的基本概念复习:回顾集合的定义、元素的性质以及集合的表示方法,为学习集合运算打下基础。
2. 集合的并集与交集:- 并集的定义及性质;- 交集的定义及性质;- 并集与交集的运算法则;- 韦恩图表示集合的并集与交集。
3. 集合的差集与补集:- 差集的定义及性质;- 补集的定义及性质;- 差集与补集的运算法则;- 韦恩图表示集合的差集与补集。
4. 集合运算的应用:- 利用集合运算解决实际问题,如兴趣班报名、活动组织等;- 分析生活中的集合运算实例,培养学生的学以致用能力。
数据结构—集合的并、交、差运算
实验报告题目:编制一个演示集合的并、交、和差运算的程序一、问题描述:设计一个程序,要求实现集合的并、交、和差的运算二、需求分析1.本演示程序中,集合的元素限定为数字。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在其后。
3.程序执行的命令包括:1)构造集合1;2)构造集合2;3)求并集;4)求交集;5)求差集;6)结束。
“构造集合1”和“构造集合2”时,需以字符串的形式键入集合元素。
4.测试数据(1) A={1、2、3、4、9} B={2、3、5、7、8}A∪B={9、4、3、2、1、8、7、5} A∩B={3、2} A-B={9、4、1}三、概要设计为实现上述程序功能,应以有序链表表示集合。
为此,需要两个抽象数据类型:有序表和集合1.有序表的抽象数据类型定义为:ADT OrderedList{数据对象:D={ai|ai∈CharSet,i=1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,ai-1<ai,i=2,…,n}基本操作:InitList(&L)操作结果:构造一个空的有序表L。
DestroyList(&L)初始条件:有序表L已存在操作结果:销毁有序表L。
CreateList(&L,n)操作结果:构造一个含有n个元素的链表L。
ListLength(L)初始条件:链表L已经存在。
操作结果:返回L中数据元素的个数。
GetElem(L,i,&e)初始条件:链表L已经存在。
操作结果:用e返回L中第i个元素的值。
Equal(c1,c2)初始条件:链表L已经存在且不为空。
操作结果:判断链表L中两元素是否相等,若相等则返回true,否则返回false。
LocateElem(L,e,equal)初始条件:链表L已经存在,Equal是数据元素的判定函数。
数据结构课程设计-集合的交并差运算
编号:730数据结构与算法课程设计说明书集合的交并差运算学院:海洋信息工程学院专业:网络工程学生姓名:xx学号:xx指导教师:xx2017 年12 月21 日目录目录 (2)概述 (3)程序说明 (3)1 实验内容 (4)1.1实验目的 (4)1.2实验任务 (4)1.3要求 (4)2 数据结构设计及流程图 (5)2.1 抽象数据结构类型定义 (5)2.2本程序包含四个模块 (7)3 测试数据 (8)3.1源程序 (8)3.2测试数据及程序运行情况 (14)4 总结 (15)参考文献 (15)概述本演示程序的编写,主要运用的我们学的第二章《线性表》中的知识。
线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一的一个被称做“第一个”的数据元素;(2)存在唯一的一个被称做“最后一个”的数据元素;(3)除第一个之外,集合中的每个数据元素均只有一个前驱;(4)除最后一个之外,集合中每个数据元素均只有一个后继。
本程序需要两个抽象数据类型:有序表和集合。
而且采用了单链表来实现。
一、程序说明本程序主要利用单链表及函数,实现集合的交集、并集和差集运算。
运行程序说明:菜单执行的命令包括<0-7> :<1>“请输入 A 集合的个数与A集合元素”<2>“请输入 B 集合个数与B集合的元素”<3>“A集合的有序集合”<4>“B集合的有序集合”<5>“AB集合的并集”<6>“AB集合的交集”<7>“AB集合的差集”<0>“退出” 注:展示程序中,集合元素限定为小写字母数据,以“回车键”束标志。
1、实验内容1.1 实验目的:设计一个演示集合的交、并、差的运算程序1.2 实验任务1) 使用单链表来表示集合,完成集合的交集、并集、差等操作。
2) 采用链表等数据结构。
3) 集合的元素限定为数字和小写的英文字母1.3 实验要求:1. 初步完成总体设计,建立头文件,确定函数个数。
数据结构集合课程设计
数据结构集合课程设计一、课程目标知识目标:1. 理解集合的基本概念,掌握集合的表示方法及其特点;2. 学会使用集合进行数据处理,了解集合在解决实际问题中的应用;3. 掌握集合的基本运算,如并集、交集、差集等,并能够灵活运用;4. 了解集合与数据结构其他概念之间的关系,为后续学习打下基础。
技能目标:1. 能够运用集合表示现实生活中的问题,培养问题分析和解决能力;2. 熟练使用集合运算,提高数据处理和逻辑思维能力;3. 学会运用集合进行算法设计和分析,提升编程实践能力;4. 能够结合实际问题,选择合适的数据结构进行优化。
情感态度价值观目标:1. 培养学生对数据结构的兴趣,激发学习热情;2. 培养学生的团队合作意识,提高沟通能力;3. 培养学生严谨、求实的科学态度,提高问题解决能力;4. 使学生认识到数据结构在信息技术领域的重要地位,增强专业认同感。
本课程针对高中年级学生,充分考虑学生特点,注重培养实际应用能力和逻辑思维能力。
结合课程性质和教学要求,将目标分解为具体的学习成果,为后续教学设计和评估提供依据。
通过本课程的学习,使学生掌握集合的基本知识和技能,培养解决实际问题的能力,提高数据处理和逻辑思维能力。
同时,培养学生对数据结构的兴趣和专业认同感,为信息技术领域的人才培养奠定基础。
二、教学内容1. 集合基本概念:集合的定义、表示方法、集合元素性质;2. 集合运算:并集、交集、差集、对称差集的定义及运算规则;3. 集合应用实例:分析现实生活中集合的应用,如购物车、社交网络等;4. 集合与数据结构:介绍集合与其他数据结构(如列表、字典等)的关系;5. 集合的编程实现:运用编程语言(如Python)实现集合及其运算;6. 集合算法设计:分析集合相关算法,如查找、排序等;7. 集合在实际问题中的应用:探讨集合在数据处理、算法优化等方面的应用。
教学内容依据课程目标进行选择和组织,确保科学性和系统性。
教学大纲安排如下:1. 第一周:集合基本概念及表示方法;2. 第二周:集合运算及其规则;3. 第三周:集合应用实例分析;4. 第四周:集合与数据结构的关系;5. 第五周:集合的编程实现;6. 第六周:集合算法设计;7. 第七周:集合在实际问题中的应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子与信息工程学院数据结构实验报告实验名称: 集合的运算实验类型:设计 (验证、设计、创新)班级: 2013级电信三班学号: ************ 姓名:陆杰实验时间: 2015 年 6 月 16 日指导教师:余先伦成绩:目录一课程设计目的和要求二问题描述及分析三算法思想和程序的实现概述3.1 算法思想3.2 程序的实现概述四程序流程图流程图五程序的实现5.1 主函数5.2 链表的生成5.3 集合的输出5.4 并运算函数5.5交运算函数5.6 差函数六运行结果分析6.1 程序主界面6.2整数集合并运算6.3 整数集合交运算6.4 整数集合差运算6.5 字母集合并运算6.6 字母集合交运算6.7 字母集合差运算6.8 字母和数据集合并运算6.9 字母和数据集合交运算6.10 字母和数据集合差运算6.11 退出程序七源代码八总结九参考文献一课程设计目的和要求目的:深入理解数据结构的基本理论,掌握数据存储结构的设计方法,掌握基于数据结构的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。
在实践中培养独立分析问题和解决问题的作风和能力。
要求:熟练运用C++语言、基本数据结构和算法的基础知识,独立编制一个具有中等难度的、解决实际应用问题的应用程序。
通过题意分析、选择数据结构、算法设计、编制程序、调试程序、软件测试、结果分析、撰写课程设计报告等环节完成软件设计的全过程,不断地完善程序以提高程序的性能。
二问题描述及分析问题描述:本课程设计中,集合的元素可以是字母[a,b,…z],也可以是整数[0,1,…9],集合的大小集合输入的形式为一个以“回车符”为结束标志的字符,允许出现重复字符或非法字符,程序应能自动滤去。
输出的运算结果字符串中将不含重复字符或非法字符。
问题描述:有两个集合A、B,要求它的交集、并集和差集C。
用两个链表p、q存储集合A、B,用链表r存储集合C。
描述该问题的存储结构,算法,并通过编写程序来实现。
问题分析:1. 定义一个链表来存储集合元素;2. 链表L包括数据域和指针域,数据域中存储集合元素,指针域中存储下一个集合元素的位置;3. 创建若干个基本函数,通过函数调用对链表进行操作,实现集合的交、并、差运算。
三算法思想和程序的实现概述3.1 算法思想定义一个链表,链表有整型数据和一个指向链表的指针,程序包含定义一个新链表的函数,集合并函数,集合交函数,集合差函数。
求两集合交集并集差集从两集合的头结点开始,比较两集合元素大小,进行对应的操作,直到读取到两集合的末尾元素。
主程序先定义三个集合,创建集合A读入A数据,创建集合B读入B数据,然后输出集合A,B的元素,求出两集合并集并输出。
求两集合的交集和差集的运算与求并集的步骤类似,只需按提示输入即可。
3.2 程序的实现概述(1)输入的形式和输入值的范围:输入是从键盘输入的,输入的内容为整数。
(2)输出的形式从屏幕输出,显示用户输入集合的元素,并显示进行运算后的值。
(3)存储结构在这次设计中开始我是采用链式存储结构,使得集合的算法定义十分简洁。
(4)算法实现定义链表,创建链表,输出链表。
利用链表的来存储集合。
利用三个函数分别实现课程要求程序实现的求并、求交和差三中运算。
现分述如下:A)并运算函数该函数采取了用新集合存储两集合并后的新集合,利用一个for循环来消除新集合中相同的元素,使其在屏幕上只显示一次。
B)交运算函数该函数用于实现集合的并运算,利用for嵌套实现两链表中数据的比较,输出两链表中相同的元素。
C)差函数该函数用于实现集合的差运算,利用链表中的数据域进行判断。
输出不同于被减集合中不存在的元素。
四程序流程图流程图:五程序的实现改程序的实现步骤是定义链表,创建链表,输出链表。
利用链表的来存储集合。
利用三个函数分别实现课程要求程序实现的求并、求交和差三中运算。
现分述如下:5.1 主函数void bangzhu(){printf("\n\t\t\t***********************************");printf("\n\t\t\t* 求集合的交并差 *");printf("\n\t\t\t*********************************\n"); }void main() /* 主函数 */{struct set *p,*q,*r;int m,n,node;bangzhu();for(;;){do{printf("请输入您要选择操作的代码:\n");printf("1:求两集合的并A∪B\n");printf("2:求两集合的交A∩B\n");printf("3:求两集合的差A-B\n");printf("0:退出该程序\n");scanf("%d",&node);} while(node<0||node>3);if(node==0) exit(1);printf("\t\t\t/*请输入集合A中元素的个数:*/\n");scanf("%d",&m);createlist_p(p,m); /* 调用链表生成函数生成A链表 */ printf("\t\t\t/*请输入集合B中元素的个数:*/\n");scanf("%d",&n); /* 调用链表生成函数生成B链表 */createlist_p(q,n);printf("集合A中元素为:");printlist_p(p); /* 调用集合输出函数输出集合A */printf("集合B中元素为:");printlist_p(q); /* 调用集合输出函数输出集合A */ while(node<0||node>3);switch(node){case 1: Addset( p,q,r);printf("A∪B:\n");printlist_p(r);break;case 2: Subset( p,q,r);printf("A∩B:\n");printlist_p(r);break;case 3: Intset(p,q,r); printf("A-B:\n");printlist_p(r);break;}printf("\n");}}5.2 链表的生成void createlist_p(struct set *&p,int n){int i;struct set *L;p=(struct set *)malloc(sizeof(set)); /* 申请结点p */p->next=NULL; /* 定义p的next指针为空 */for(i=n;i>0;i--){L=(struct set *)malloc(sizeof(set)); /* 申请结点L*/printf("请输入该集合中第%d个整数元素:",n-i+1); scanf("%s",&L->coef);L->next=p->next;p->next=L;}}//生成新链表用于存放两集合中的元素5.3 集合的输出void printlist_p(struct set *&p){struct set *L;int i;L=p->next;if(!L) printf("该表为空!\n");while(L!=NULL){printf("%c ",L->coef);L=L->next;i++;}printf("\n");}//打印输入的两集合中的元素5.4 并运算函数void Addset(struct set *&p,struct set *&q,struct set *&r){struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set)); /* 申请结点r */r->next=NULL; /* 定义r的next指针为空 */ k=p->next; /* k指向p的下一个结点 */for(;k;){m=(struct set *)malloc(sizeof(set)); /* 申请结点m */m->next=r->next;r->next=m;m->coef=k->coef;k=k->next;} /* 把第一个集合中的元素放在新集合中 */ k=q->next;m=(struct set *)malloc(sizeof(set));m->next=r->next;r->next=m;m->coef=k->coef;k=k->next;for(;k;){for(n=r->next;(k->coef!=n->coef)&&n->next;){n=n->next;} /* 与新集合中的元素比较,如果不同则链入链表中 */ if((k->coef!=n->coef)&&!(n->next)){m=(struct set *)malloc(sizeof(set));m->next=r->next;r->next=m;m->coef=k->coef;}k=k->next;} /* 对第二个集合中的元素进行分析 */} /* 求A∪B */该函数采取了用新集合存储两集合并后的新集合,利用一个for循环来消除新集合中相同的元素,是其在屏幕上只显示一次。
5.5交运算函数void Subset(struct set *&p,struct set *&q,struct set *&r){struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set)); /* 申请结点r */n=q->next;for(;n;) /* 比较p和q链表中的元素,相同的元素存入链表r中 */{m=p->next;for(;(m->coef!=n->coef)&&m->next;){m=m->next;}if(m->coef==n->coef){k=(struct set *)malloc(sizeof(set));k->next=r->next;k->coef=m->coef;}n=n->next;}} /* 求A∩B */该函数用于实现集合的并运算,利用for嵌套实现两链表中数据的比较,输出两链表中相同的元素。