计算0901-第11组-集合的并、交和差运算的程序

合集下载

集合的交并运算

集合的交并运算

#include<stdio.h>#include<conio.h>#include<stdlib.h>#define ListSize 100 //允许的最大长度typedef char ListData;typedef struct List{ListData data[ListSize];int Length; //当前元素个数}*SeqList;void menu() //建立菜单{printf("|--------集合的交并运算--------|\n");printf("|-------------菜单-------------|\n");printf("| 1、初始化集合A |\n");printf("| 2、初始化集合B |\n");printf("| 3、显示集合A、B |\n");printf("| 4、集合的并运算|\n");printf("| 5、集合的交运算|\n");printf("| 6、退出|\n");printf("|———————————————|\n");printf("\n");}//模块1 建立void Creat(SeqList&L){L=(SeqList)malloc(sizeof(List));if(L==NULL){printf("存储空间分配失败!\n");exit(1);}L->Length=0;}int Length(SeqList&L){return L->Length;}//模块2 初始化void Begin(SeqList&L){int i=0;printf("请输入集合中的元素,按#结束。

数据结构课设报告_集合的并、交和差运算的程序

数据结构课设报告_集合的并、交和差运算的程序
1.void InitSet(Set &Res)
操作结果:初始化集合的函数,函数参数为引用类型。
2.Set DealSet(char *s)
初始条件:指针s不为空
操作结果:将字符串处理成集合,生成的集合为函数返回值。
3.void PriSet(Set s)
操作结果:打印集合s。
4.Set Jiao(Set sa,Set sb)
3.void PriSet(Set s):
输出集合s,首先输出左花括号’{’,之后使用for循环遍历整个hash数组,如果hash数组的值为真,则说明该集合包含此项元素,输出该元素加空格,之后再输出右花括号’}’。
4.Set Jiao(Set sa,Set sb)
定义两个形参集合sa和sb,遍历两个集合的hash数组,如果两个hash数组的值同时为真,则说明sa和sb集合都含有该元素,则将该元素加入函数之中定义的Res集合,并将Res集合的元素个数加一。在程序最后返回Res集合的值。
Res.num=0;//元素个数为0
}
Set DealSet(char *s)//将字符串处理成集合
{
Set Res;//函数返回的集合
InitSet(Res);//初始化集合
for (int i=0;i<strlen(s);i++)//遍历整个字符串
{
if (s[i]>='a' && s[i]<='z')//在a到z之间,才符合集合元素范围
5.Set Bing(Set sa,Set sb)
和Jiao()函数类似,同样遍历hash数组,唯一不同的是判断hash数组的语句,只要sa和sb其中有一个的值为真,则加入到Res中。

集合的并交差运算c++

集合的并交差运算c++

集合的并交差运算c++在C++中,集合的并、交、差运算是常见的操作。

集合是一种数据结构,它可以存储一组不同的元素,这些元素没有重复。

以下是集合的并、交、差运算的示例代码:1. 集合的并运算set<int> setA;set<int> setB;set<int> setUnion;set_union(setA.begin(), setA.end(), setB.begin(), setB.end(), inserter(setUnion, setUnion.begin()));2. 集合的交运算set<int> setA;set<int> setB;set<int> setIntersection;set_intersection(setA.begin(), setA.end(), setB.begin(), setB.end(), inserter(setIntersection,setIntersection.begin()));3. 集合的差运算set<int> setA;set<int> setB;set<int> setDifference;set_difference(setA.begin(), setA.end(), setB.begin(),setB.end(), inserter(setDifference, setDifference.begin()));以上代码使用STL库中的set容器和相应的算法函数实现集合的并、交、差运算。

其中,set_union()函数可以将两个集合的并集放入一个新的集合中,set_intersection()函数可以将两个集合的交集放入一个新的集合中,set_difference()函数可以将两个集合的差集放入一个新的集合中。

使用inserter()函数可以将新集合的元素插入到新集合的任意位置。

数据结构课程设计_集合的并、交和差运算

数据结构课程设计_集合的并、交和差运算

数据结构课程设计学院:信息科学与工程学院专业:计算机科学与技术班级:学号:学生姓名:指导教师: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。

集合的并交差运算

集合的并交差运算

石河子大学《集合的并,交和差运算》程序设计基础课程设计报告二OO八年六月二十五日目录一.编程目的: (2)二.设计要求: (2)三.各函数功能说明: (2)四.流程图: (22)五.总结: (7)参考书目 (24)一.编程目的:编写数学程序,能够演示执行集合的集合的并,交和差运算的程序,可以任意对两个集合进行集合之间的运算。

通过该程序的编写,更加熟练的掌握类和动态链表。

经过自己的查找和询问,让自己对书上的知识理解的更加透彻一点了,该程序让我们把书上的知识灵活运用,让我们把书上的知识变活了。

二.设计要求:1.集合的限定:集合元素必须为小写字母2.在屏幕上输出全部运算情况三.各函数功能说明:函数源代码以及函数的功能:#include<iostream>using namespace std;typedef struct pointer{char dat;struct pointer *link;} pointer;void readdata(pointer *head){ //读集合pointer *p;char tmp;cin>>tmp;while(tmp!='0'){if((tmp<'a')||(tmp>'z')){cout<<"\n";return;}p=new pointer;p->dat=tmp;p->link=head->link;head->link=p;cin>>tmp;//cout<<tmp<<" ";}}void disp(pointer *head){ //显示集合数据pointer *p;p=head->link;while(p!=NULL){cout<<p->dat<<" ";p=p->link;}cout<<endl;}void bing(pointer *head1,pointer *head2, pointer *head3){ //计算集合1与集合2的并pointer *p1,*p2,*p3;p1=head1->link;while(p1!=NULL){p3->dat=p1->dat;p3->link=head3->link;head3->link=p3;p1=p1->link;}p2=head2->link;while(p2!=NULL){p1=head1->link;while((p1!=NULL)&&(p1->dat!=p2->dat))p1=p1->link;if(p1==NULL){p3=(pointer *)malloc(sizeof(struct pointer));p3->dat=p2->dat;p3->link=head3->link;head3->link=p3;}p2=p2->link;}}void jiao(pointer *head1,pointer *head2, pointer *head3){ //计算集合1与集合2的交pointer *p1,*p2,*p3;p1=head1->link;while(p1!=NULL){p2=head2->link;while((p2!=NULL)&&(p2->dat!=p1->dat))if((p2!=NULL)&&(p2->dat=p1->dat)){p3=new pointer;p3->dat=p1->dat;p3->link=head3->link;head3->link=p3;}p1=p1->link;}}void cha(pointer *head1,pointer *head2, pointer *head3){ //计算集合1与集合2的差pointer *p1,*p2,*p3;p1=head1->link;while(p1!=NULL){p2=head2->link;while((p2!=NULL)&&(p2->dat!=p1->dat))p2=p2->link;if(p2==NULL){p3=new pointer;p3->dat=p1->dat;p3->link=head3->link;head3->link=p3;}p1=p1->link;}}main(){pointer *head1,*head2,*head3;head1=new pointer;head1->link=NULL;head2=new pointer;head2->link=NULL;head3=new pointer;head3->link=NULL;cout<<"输入集合1:"<<endl;readdata(head1);cout<<"输入集合2:"<<endl;readdata(head2);/*cout<<"集合1为:"<<endl;disp(head1);cout<<"集合2为:"<<endl;disp(head2); */cout<<"集合1与集合2的并为:"<<endl;bing(head1,head2,head3);disp(head3);head3->link=NULL;cout<<"集合1与集合2的交为:"<<endl;jiao(head1,head2,head3);disp(head3);head3->link=NULL;cout<<"集合1与集合2的差为:"<<endl;cha(head1,head2,head3);disp(head3);}运行结果:四.函数框架图:五.总结:在做程序设计前就已经感觉到我设计的《集合的并,交和差运算》比较复杂,不仅要写出实现各种功能的函数还要保证函数之间的连接,怎样通过函数之间的关系能很好的把函数连接起来,还要保证程序能够很好的而且有效的运行。

集合的并、交、差运算

集合的并、交、差运算
cout<<endl;break;
case 2: cout<<"集合交运算:Set1∩Set2 = ";
MulSet(dest, src1, src2);
DisplaySet(dest);
EmptySet(dest);
cout<<endl;break;
while(src->next!=NULL)
{
i++;
src=src->next;
}
return i;
}//LengthOf
void CreateSet(Set dest)
{
//创建一个新的字母集合,限定a-z
ElemType ch;
Set p=dest,n;
cout<<endl;
cout<<"Set1 = ";DisplaySet(src1);
cout<<"\t";
cout<<"Set2 = ";DisplaySet(src2);
cout<<endl<<endl;
int item;
cout<<"1->集合并"<<" "<<"2->集合交"<<" "<<"3->集合差"<<" "<<"非零整数->错误!重输"<<" "<<"0->进入下一步演示"<<endl;

c语言程序求集合的并集,交集,差集运算

C语言是一种广泛应用的计算机程序设计语言,它具有高效、灵活、可移植等特点,因此在计算机科学领域被广泛应用。

本篇文章将探讨在C语言中如何求集合的并集、交集和差集运算。

一、集合的概念集合是数学中重要的概念,它是由元素组成的无序的集合体。

在计算机科学中,我们常常需要对集合进行各种操作,比如求并集、交集、差集等。

二、集合的表示方法在C语言中,我们可以使用数组来表示集合。

数组是一种非常基础的数据结构,它由相同类型的元素组成的有序集合。

我们可以通过定义数组来表示一个集合,并通过遍历数组来进行各种集合运算。

三、集合的并集运算集合A和集合B的并集运算是指将A和B中的所有元素放在一起组成一个新的集合。

在C语言中,我们可以通过遍历两个数组,将它们的元素放在一个新的数组中即可实现并集运算。

下面是C语言中求两个集合的并集运算的示例代码:```#include <stdio.h>int m本人n() {int setA[] = {1, 2, 3, 4, 5};int setB[] = {3, 4, 5, 6, 7};int setSize = 5;int setUnion[10];int unionSize = 0;for (int i = 0; i < setSize; i++) {setUnion[unionSize++] = setA[i]; }for (int i = 0; i < setSize; i++) {int found = 0;for (int j = 0; j < setSize; j++) {if (setB[i] == setA[j]) {found = 1;break;}}if (!found) {setUnion[unionSize++] = setB[i];}}// 输出并集for (int i = 0; i < unionSize; i++) {printf("d ", setUnion[i]);}return 0;}```以上代码中,我们定义了两个集合setA和setB,分别表示集合A和集合B,然后通过遍历这两个数组,将它们的元素放入一个新的数组setUnion中。

【程序】集合的交并差(C语言)

#include<stdio.h>#include <malloc.h>#include <stdlib.h>#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;//*******************************************定义顺序表、初始化******************************//#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{ElemType *elem;int length;int listsize;}SqList;Status InitList_Sq(SqList *L)//初始化一个顺序表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;}//******************************************定义顺序表的输入输出函数********************//void Input_Sq(SqList *L)//输入顺序表L的元素,要求先输入顺序表的长度(元素个数){int length,i,x;printf("\nPlease input the SList length:");scanf("%d",&length);L->length=length;printf("\nPlease input %d elemts:",length);for(i=0;i<length;i++){scanf("%d",&x);}}void Output_Sq(SqList L)//依次输出顺序表L的元素{int i;printf("\nThe list elemt:\n");for(i=0;i<L.length;i++)printf("%3d",L.elem[i]);}//**********************************定义插入函数***********************************************//void insert(SqList *L,int i,ElemType e){ElemType *newbase;if(L->length>=L->listsize){newbase=(ElemType*)realloc(L->elem,(LISTINCREMENT+LIST_INIT_SIZE)*sizeof(ElemType));if(!newbase) exit(OVERFLOW);L->elem=newbase;L->listsize=L->listsize+LISTINCREMENT;}for(i=L->length-1;(i>=0)&&(L->elem[i]>e);i--)L->elem[i+1]=L->elem[i];L->elem[i+1]=e;L->length++;}//*********************************实现集合LA、LB并集的函数***************************************//void bing_ji(SqList *La,SqList *Lb,SqList *Lc){int i,j,a,b;ElemType c,e;a=La->length;b=Lb->length;for(i=0;i<a;i++){Lc->elem[i]=La->elem[i];//将a中元素复制进集合c中;Lc->length=a;}for(i=0;i<b;i++){for(j=0;j<a;j++){c=La->elem[j];if(c==e) break;}if(j>=a)insert(Lc,1,e);}}//********************************实现集合LA、LB交集的函数************************************//void jiao_ji(SqList *La,SqList *Lb,SqList *Lc){int i,j,a,b,m=0;ElemType c,e;a=La->length;b=Lb->length;for(i=0;i<b;i++){e=Lb->elem[i];for(j=0;j<a;j++){c=La->elem[j];if(c==e) break;}if(j<a)Lc->elem[m++]=e;}Lc->length=m;}//********************************实现集合LA、LB差集的函数********************************//void cha_ji(SqList *La,SqList *Lb,SqList *Lc){int i,a,b;ElemType m,n,e;a=La->length;b=Lb->length;i=0;while(i<a&&i<b){m=La->elem[i];n=Lb->elem[i];e=m-n;Lc->elem[i]=e;i++;}if(i>=a&&i>=b){Lc->length=i;}elseif(i>=a){while(i<b){Lc->elem[i]=(-1)*Lb->elem[i];i++;}Lc->length=i;}else{while(i<a){Lc->elem[i]=La->elem[i];i++;}Lc->length=i;}}//***********************************集合的交并差,主函数*******************************//void main(){SqList LA,LB,Lbing,Ljiao,Lcha;InitList_Sq(&LA);InitList_Sq(&LB);InitList_Sq(&Lbing);InitList_Sq(&Ljiao);InitList_Sq(&Lcha);Input_Sq(&LA);Output_Sq(LA);Input_Sq(&LB);Output_Sq(LB);jiao_ji(&LA,&LB,&Ljiao);printf("\n集合LA、LB 的交集是:"); int i;for(i=0;i<Ljiao.length;i++)printf("%3d",Ljiao.elem[i]);bing_ji(&LA,&LB,&Lbing);printf("\n集合LA、LB的并集是:"); int j;for(j=0;j<Lbing.length;j++)printf("%3d",Lbing.elem[j]);cha_ji(&LA,&LB,&Lcha);printf("\n集合LA、LB的差集是:"); int k;for(k=0;k<Lcha.length;k++)printf("%3d",Lcha.elem[k]);printf("\n");}。

集合的并、交和差运算

集合的并、交和差运算题目:编制一个演示集合的并、交和差运算的程序班级:姓名:学号:完成日期:一、需求分析1.本演示程序中,集合的元素限制在小写字母‘a’-‘z’之间。

集合的大小不限制,集合的输入形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序运用时自动过滤去,输出的运算结果中将不含重复字符和非法字符。

2.演示程序以用户和计算机对话的形式进行,即在计算机终端中显示提示信息之后,有用户自行选择下一步命令,相应输入数据和运算结果在其后显示。

3.程序的执行命令有:1)选择操作2)任意键清屏4.数据测试(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.顺序表抽象数据类型定义ADT sqlist{数据对象:D={ai|a i∈Elemset,i=1,2,3,…n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2, … n}基本操作:InitList(&l)操作结果:构造一个空的顺序表l。

ListLength(l)初始条件:顺序表l已存在。

操作结果:返回l中的元素个数。

ListInsert_Sq(&L, i, e)初始条件:顺序表l已存在。

操作结果:在l中第i个元素前面插入元素e。

CreatSqList(&l, a[],n)初始条件:顺序表l已存在。

操作结果:将数组a[n]每个元素赋给顺序表l。

GetElem(L, i, &e)初始条件:顺序表l已存在。

C语言实现集合的交,并,差

【问题描述】编制一个能演示执行集合的并、交和差运算的程序【基本要求】(1)集合的元素限定为小写字母字符[ 'a'......'z' ](2 )演示程序以用户和计算机对话的方式执行【测试数据】【实现提示】以有序链表表示集合【代码过程】1。

先定义集合的数据类型notes.htypedef struct LNode...{ElemType data;LNode *next;}*Link, *Position;typedef struct...{Link head,tail;int len;}LinkSet;//~#include<stdio.h>#include <malloc.h>#include <stdlib.h>//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define ElemType int //存放数据的类型typedef int Status; //函数的返回值//~/**//****************** 函数定义*********************/ Status InitSets(LinkSet &ls)...{//初始化集合ls.head = (Link) malloc( sizeof(Link));ls.tail = (Link) malloc( sizeof(Link));if(!ls.head || !ls.tail) exit(OVERFLOW); //如果分配失败>next = ls.tail->next = NULL; //头、尾指针为空ls.len = 0; //长度为0return OK;}Status CreateNode(Link &link,ElemType e)...{//创建一节点,内容为elink = (Link) malloc( sizeof(Link));if(!link) exit(OVERFLOW);link->data = e; //值设定link->next = NULL; //指向空return OK;}Position PriorInsertNode(LinkSet &ls,Link &link)...{//找出节点link要插入到ls的前一个节点if(!ls.head->next) return ls.head;Link h1 = ls.head->next, h2 = h1->next; //h1:前一节点,h2:前一节点的后一节点if(link->data < h1->data) return ls.head; //如果比第一个节点小,返回头指针while(h1 && h2)...{if(h1->data < (link->data) && h2->data > (link->data) ) //如果>h1 && <h2,说明找到插入的地方了break;if(h1->data == (link->data) || h2->data ==(link->data) )return NULL; //如果重复,返回NULL else //否则,顺次往后挪一个节点h1=h2,h2=h1->next;}return h1;}Status Append(LinkSet &ls, Link &link)...{//向集合末尾追加节点if(ls.head->next == NULL) ls.head->next = link;else ls.tail->next->next = link;ls.tail->next = link;ls.len ++;return OK;}Status InsertNode(LinkSet &ls, Link &link)...{//向集合中插入节点Position p = PriorInsertNode(ls,link);if(!p) return ERROR; //如果集合中已有相应元素link->next = p->next;if(!p->next) ls.tail->next = link; //如果前一节点为尾节点,修改tail p->next = link;ls.len++;return OK;}Position PriorNode(LinkSet &ls, Link &link)...{//返回集合中该节点的前一节点,不存在返回NULLint j=0;Link pre,h = ls.head;while(h->next && j<=ls.len && h!=link)...{pre = h; h=h->next; j++;}if(j==0) return NULL;return pre;}Status PrintSets(LinkSet &ls)...{//打印集合Link h=ls.head->next;printf("[ ");while(h)...{printf("%c ",h->data);h = h->next;}printf(" ] ");return OK;}Position GetHead(LinkSet &ls)...{//获得集合的头节点return ls.head;}Position NextPos(Link &link)...{//获得当前节点的下一个节点return link?link->next:link;}Status Empty(LinkSet &ls)...{//空为真return ls.head->next==NULL;}ElemType GetCurElem(Link &link)...{//获得当前节点的数据return link->data;}int Compare(Link &la, Link &lb)...{//判断两个节点的大小return la->data - lb->data;}int Compare(ElemType e1, ElemType e2)...{//比较两个数字的大小return e1-e2;}Status DelFirst(LinkSet &ls,Link &q)...{//已知h为线性链表的头节点,删除表中的第一个节点,并以q返回Link h = ls.head;if(!h->next) return ERROR;q = h->next;h->next = h->next->next;q->next=NULL;ls.len--;return OK;}Status FreeNode(Link &l)...{//释放节点,有问题free(l);return OK;}Status UnionSets(LinkSet lsa, LinkSet &lsb, LinkSet &lsc)...{ //已知集合ls1,ls2的元素按值非递减排列//将集合ls1,ls2的并集到ls3if( !InitSets(lsc) ) return ERROR;Link node;Link ha = lsa.head, hb=lsb.head; //找到两节点的头指针Link pa = NextPos(ha), pb = NextPos(hb);while( !Empty(lsa) && !Empty(lsb) )...{int result = Compare(pa,pb); //比较两节点大小if( result<0) ...{DelFirst(lsa,node);Append(lsc,node); pa = NextPos(ha); //向lsc插入lsa 的相关节点}else if(result>0)...{ //向lsc 插入lsb的相关节点DelFirst(lsb,node);Append(lsc,node); pb = NextPos(hb);}else...{DelFirst(lsb,node); pb = NextPos(hb);//如果两节点相同,删除lsb中重复的节点,即以lsa为标准}}while(!Empty(lsa))...{DelFirst(lsa,node);Append(lsc,node);}while(!Empty(lsb))...{DelFirst(lsb,node);Append(lsc,node);}return OK;}Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{//已知集合ls1,ls2的元素按值非递减排列//将集合ls1,ls2的交集到ls3if( !InitSets(lsc) ) return ERROR;Link node;Link ha = lsa.head, hb=lsb.head;Link pa = NextPos(ha), pb = NextPos(hb);while( !Empty(lsa) && !Empty(lsb) )...{int result = Compare(pa,pb);if( result<0) ...{DelFirst(lsa,node);pa = NextPos(ha);}else if(result>0)...{DelFirst(lsb,node); pb = NextPos(hb);}else...{DelFirst(lsb,node); Append(lsc,node);pb = NextPos(hb);DelFirst(lsa,node);pa = NextPos(ha);}}while(!Empty(lsa))...{DelFirst(lsa,node);Append(lsc,node);}return OK;}Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{ //已知集合ls1,ls2的元素按值非递减排列//ls3 = ls1 - ls2if( !InitSets(lsc) ) return ERROR;Link node;Link ha = lsa.head, hb=lsb.head;Link pa = NextPos(ha), pb = NextPos(hb);//,pb2 = NextPos(pb1);while( !Empty(lsa) && !Empty(lsb) )...{int result = Compare(pa,pb);if( result<0) ...{DelFirst(lsa,node);Append(lsc,node);pa = NextPos(ha);}else if(result>0)...{DelFirst(lsb,node); pb = NextPos(hb);}else...{DelFirst(lsa,node); pa = NextPos(ha);DelFirst(lsb,node); pb = NextPos(hb);}}return OK;}Status CopySets(LinkSet lsa, LinkSet lsb)...{//将集合lsa拷贝到lsb中InitSets(lsb);Link la = lsa.head->next, lb = lsb.head->next;while(la)...{Link node;CreateNode(node,la->data);lb=node;lsb.len++;la = la->next;lb = lb->next;}lsb.tail = lb;return OK;}#include "constValues.h" //常量头文件#include "notes.h" //节点定义头文件#include "setsFun.h" //集合操作函数头文件/**//**************** 测试***********************************/void Initialization()...{printf("************************************************************************* *** " );printf("*MakeSet1-1 MakeSet1-2 Union-u Intersection-i Difference-d Quit-q * " );printf("************************************************************************* *** " );}void main()...{LinkSet set1,set2,set3,seta,setb;InitSets(set1),InitSets(set2); //初始化集合while(1)...{Initialization();printf("集合Set1:");PrintSets(set1); //打印集合set1printf("集合Set2:");PrintSets(set2); //打印集合set1printf("请键入操作代码:");fflush(stdin); //清空缓冲区char oper = getchar();char setsContent[200];switch(oper)...{case '1': //集合set1 赋值printf("请输入集合Set1的内容:");fflush(stdin);gets(setsContent);InitSets(set1);SetSets(set1,setsContent);break;case '2': //集合set1 赋值printf("请输入集合Set1的内容:");fflush(stdin);gets(setsContent);InitSets(set2);SetSets(set2,setsContent);break;case 'u':case 'U': //求并InitSets(set3);CopySets(set1,seta); //因为求并的算法是添加一个节点,删除set1,set2中对应的节点,CopySets(set2,setb); //所以要复制一份UnionSets(seta,setb,set3); //下同printf("set1 U set2=: ");PrintSets(set3);fflush(stdin);getchar();break;case 'i':case 'I': //求交InitSets(set3);CopySets(set1,seta);CopySets(set2,setb);IntersectionSets(seta,setb,set3);printf("set1 交set2=: ");PrintSets(set3);fflush(stdin);getchar();break;case 'd':case 'D': //求差InitSets(set3);CopySets(set1,seta);CopySets(set2,setb);DifferenceSets(seta,setb,set3);printf("set1 - set2=: ");PrintSets(set3);fflush(stdin);getchar();break;case 'q':case 'Q':exit(0);break;}system("cls"); //清屏} }//~。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计题目:集合的并、交和差运算的程序组号:第11组成员:任务:编制一个演示集合的并、交和差运算的程序。

要求:集合的元素限定为整型数据;用三个子程序分别完成并、交和差运算,并输出结果。

1、 需求分析首先对题目分析,编制集合的并、交和差运算的程序需理解集合的并、交和差运算:设A 、B 分别为实数域的两个集合,A={1,2,3,4,5},B={1,3,5,7}1)集合的并运算集合的并运算是找出两个集合所能包含的最大元素个数的集合。

即B A S =={1,2,3,4,5,7}2)集合的交运算集合的并运算是找出两个集合所能包含的最大元素个数的集合。

即B A S =={1, 3, 5}3)集合的差运算集合的并运算是找出两个集合所能包含的最大元素个数的集合。

即B A S -=={2,4}其次,依据数据结构的知识以线性表的顺序表(存储数据类型和长度)为存储结构,数 据元素类型为整型,创建两个顺序表La 和Lb 作为集合运算的主体,构建一个辅助顺序表Lc 用来保存集合运算后的结果,最后,依据集合的并、交和差运算设计合理的函数体,分别实现顺序表的创建、初始化、输出元素、并运算、交运算和差运算。

使用上述实例运行调试程序,并通过调用输出函数输出运算结果,查看是否准确无误的实现想要的运算结果。

2、 概要设计定义数据结构为顺序表,含有两个数据域:整型元素、顺序表长度、空间大小。

主函数中引用创建、初始化、并、交、差及输出顺序表的子函数。

创建顺序表中,创建一个长度为100的顺序表,由于分配的空间相对较大,没有使用追 加空间的容错程序。

使用交互操作实现对不同的顺序表选择是否立即创建元素。

初始化顺序表元素中,使用循环语句依次从终端获取人工输入的元素值。

输出顺序表元素中,使用循环语句依次输出元素,并适当控制元素间的间距便于辨认。

集合并操作中,先将一个顺序表La 的内容复制到用于暂存结果的顺序表Lc 中,再依次对另一顺序表Lb 的元素经行筛选:若元素存在于La 中(标记blog=1)则跳过该元素,继续查看下一个元素,否则将该元素附加到暂存数组Lc 的尾部。

另外添加基本容错能力查看是否能够正确执行完该操作。

集合交操作中,先将一个顺序表La 的内容依次取出与Lb 顺序表的元素一一对比,若该元素存在于Lb 中,则将该元素赋值到Lc 顺序表的表尾(length 位置),否则跳过该元素,继续查看下一个元素。

另外添加基本容错能力查看是否能够正确执行完该操作。

集合差操作中,设计程序差运算为Lc=La-Lb ;先将一个顺序表La 的内容依次取出与Lb 顺序表的元素一一对比,若该元素不存在于Lb 中(标记blog=0),则将该元素赋值到Lc 顺序表的表尾(length 位置),继续查看下一个元素,否则跳过该元素,另外添加基本容错能力查看是否能够正确执行完该操作。

3、详细设计#include<stdio.h>#include<malloc.h>#define OVERFLOW -2#define OK 1#define ERROR 0typedef int elemtype;typedef int Status;#define listintsize 100//定义数据结构typedef struct{elemtype *elem;int length;int listsize;}Sqlist;//创建数组的元素Status listinsert(Sqlist *L,int i){elemtype a;printf("输入元素值:\n");scanf("%d",&a);*(L->elem+i)=a;L->length++;return OK;}//初始化数组Status initsqlist(Sqlist *L){int i,j,k;L->elem=(elemtype *)malloc(listintsize * sizeof(elemtype));if(!L->elem)return OVERFLOW;L->length=0;L->listsize=listintsize;printf("是否现在输入元素?\n现在输入请按;\n稍后输入请按;\n");scanf("%d",&i);if(i==2)return OK;else{if(i==1){printf("输入目标数组的元素个数j:\nj=");scanf("%d",&j);for(k=0;k<j;k++)listinsert(L,k);//创建元素return OK;}else{printf("操作指令错误!\n");return ERROR;}}}//输出数组内容Status printlist(Sqlist *L){int i;for( i=0;i<L->length;i++)printf("%5d",*(L->elem+i));return OK;}//blog==0表示元素只存在于一个数组中//blog==1表示元素同时存在于两个数组中//并操作Status Bing(Sqlist *La,Sqlist *Lb,Sqlist *Lc) {int i,j;bool blog=0;for(i=0;i<La->length;i++){*(Lc->elem+i)=*(La->elem+i);Lc->length++;}for(i=0;i<Lb->length;i++){ for(j=0;j<La->length;j++)if(*(Lb->elem+i)==*(La->elem+j)){ blog=1;break;}if(blog==0){*(Lc->elem+(Lc->length))=*(Lb->elem+i);Lc->length++;}blog=0;}if(i>=Lb->length)return OK;elsereturn ERROR;}//交操作Status Jiao(Sqlist *La,Sqlist *Lb,Sqlist *Lc) {int i,j;bool blog=0;for(i=0;i<La->length;i++){ for(j=0;j<Lb->length;j++)if(*(La->elem+i)==*(Lb->elem+j)){ blog=1;break;}if(blog==1){*(Lc->elem+(Lc->length))=*(La->elem+i);Lc->length++;}blog=0;}if(i>=La->length)return OK;elsereturn ERROR;}//差操作 Lc=La-LbStatus Cha(Sqlist *La,Sqlist *Lb,Sqlist *Lc) {int i,j;bool blog=0;for(i=0;i<La->length;i++){ for(j=0;j<Lb->length;j++)if(*(La->elem+i)==*(Lb->elem+j)){ blog=1;break;}if(blog==0){*(Lc->elem+(Lc->length))=*(La->elem+i);Lc->length++;}blog=0;}if(i>=La->length)return OK;elsereturn ERROR;}//主函数int main(){//初始定义个数组Sqlist list1,list2,list3;Sqlist *La,*Lb,*Lc;La=&list1;Lb=&list2;Lc=&list3;//创建两个顺序表printf("下面按操作创建两个数组:\n---------------------------创建第一个数组La:---------------------------\n"); initsqlist(La);printf("\n创建的第一个数组La内容为:");printlist(La);printf("\n---------------------------创建第二个数组Lb:---------------------------\n"); initsqlist(Lb);printf("\n创建的第二个数组La内容为:");printlist(Lb);//实例运行集合的并操作printf("\n\n\n\n\n----------初始化预存数组Lc-----请按跳过输入元素----------\n"); initsqlist(Lc);Bing(La,Lb,Lc);printf("数组La与Lb执行集合并操作后结果为:");printlist(Lc);//实例运行集合的交操作printf("\n\n\n\n\n----------初始化预存数组Lc-----请按跳过输入元素----------\n");initsqlist(Lc);Jiao(La,Lb,Lc);printf("数组La与Lb执行集合交操作后结果为:");printlist(Lc);//实例运行集合的差操作printf("\n\n\n\n\n----------初始化预存数组Lc-----请按跳过输入元素----------\n");initsqlist(Lc);Cha(La,Lb,Lc);printf("数组La与Lb执行集合差操作La-Lb结果为:");printlist(Lc);printf("\n------------------------------------------------------\n\n\n\n");return 0;}4、调试分析按照操作提示语:1、按1 对创建的第一个顺序表La赋值,按5 设置La的长度为5 ,并依次输入5 个整型数据作为La的元素:1 ,2 ,3 ,4 ,52、按1 对创建的第二个顺序表Lb赋值,按4 设置La的长度为4 ,并依次输入4 个整型数据作为La的元素:1 ,3 ,5 ,7执行如上两步之后终端显示结果如下图:3、按2 跳过对用于保存运算结果的顺序表Lc的赋值,主函数调用并操作子函数和输出元素函数给出运算结果。

相关文档
最新文档