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

合集下载

集合的交并差运算

集合的交并差运算

#include<stdio.h>#include<malloc.h>#include<stdlib.h>struct set{int coef;struct set *next;};void createlist_p(struct set *&p,int n){int i;struct set *L;p=(struct set *)malloc(sizeof(set));p->next=NULL;for(i=n;i>0;i--){L=(struct set *)malloc(sizeof(set));牰湩晴尨请输入该集合中第%d个整数元素:,n-i+1); scanf(%d,&L->coef);L->next=p->next;p->next=L;}}//生成新链表用于存放两集合中的元素void printlist_p(struct set *&p){struct set *L;int i;L=p->next;晩??瀠楲瑮?该表为空!\n);while(L!=NULL){printf(%d ,L->coef);L=L->next;i++;}printf(\);}//打印输入的两集合中的元素void Addset(struct set *&p,struct set *&q,struct set *&r) {struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set));r->next=NULL;k=p->next;for(;k;){m=(struct set *)malloc(sizeof(set));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∪Bvoid Subset(struct set *&p,struct set *&q,struct set *&r){ struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set));r->next=NULL;n=q->next;for(;n;){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;r->next=k;k->coef=m->coef;}n=n->next;}}//求A∩Bvoid Intset(struct set *&p,struct set *&q,struct set *&r){ struct set *k,*m,*n;r=(struct set *)malloc(sizeof(set));r->next=NULL;m=p->next;for(;m;){n=q->next;for(;(m->coef!=n->coef)&&n->next;){n=n->next;}if(!n->next&&(m->coef!=n->coef)) {k=(struct set *)malloc(sizeof(set));k->next=r->next;r->next=k;k->coef=m->coef;}m=m->next;}}//求A-Bvoid bangzhu(){printf(\\t\t\t***********************************); printf(\\t\t\t* 求集合的交并差*);printf(\\t\t\t*********************************\n);}void main(){struct set *p,*q,*r;int m,n,node;bangzhu();for(;;){do{牰湩晴尨请输入您要选择操作的代码:\n);printf(:求两集合的并A∪B\n);printf(:求两集合的交A∩B\n);printf(:求两集合的差A-B\n);printf(:退出该程序\n);scanf(%d,&node);} while(node<0||node>3);if(node==0) exit(1);printf(\\t\t/*请输入集合A中元素的个数:*/\n);scanf(%d,&m);createlist_p(p,m);printf(\\t\t/*请输入集合B中元素的个数:*/\n);scanf(%d,&n);createlist_p(q,n);牰湩晴尨集合A中元素为:);printlist_p(p);牰湩晴尨集合B中元素为:);printlist_p(q);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(\);}}可以了楼上方法是正确的,学习!把分给楼上主要原因是C程序中使用了C语言不支持的引用所致,修改如下://---------------------------------------------------------------------------#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct set{int coef;struct set *next;} set ;void createlist_p(struct set **p,int n){int i;struct set *L;*p=(struct set *)malloc(sizeof(set));(*p)->next=NULL;for(i=n;i>0;i--){L=(struct set *)malloc(sizeof(set));牰湩晴尨请输入该集合中第%d个整数元素:,n-i+1); scanf(%d,&L->coef);L->next=(*p)->next;(*p)->next=L;}}//生成新链表用于存放两集合中的元素void printlist_p(struct set **p){struct set *L;int i=0;L=(*p)->next;晩??瀠楲瑮?该表为空!\n);while(L!=NULL){printf(%d ,L->coef);L=L->next;i++;}printf(\);}// 打印输入的两集合中的元素void Addset(struct set **p,struct set **q,struct set **r) {struct set *k,*m,*n;*r=(struct set *)malloc(sizeof(set));(*r)->next=NULL;k=(*p)->next;for(;k;){m=(struct set *)malloc(sizeof(set));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∪Bvoid Subset(struct set **p,struct set **q,struct set **r){ struct set *k,*m,*n;(*r)=(struct set *)malloc(sizeof(set));(*r)->next=NULL;n=(*q)->next;for(;n;){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;(*r)->next=k;k->coef=m->coef;}n=n->next;}}//求A∩Bvoid Intset(struct set **p,struct set **q,struct set **r){ struct set *k,*m,*n;(*r)=(struct set *)malloc(sizeof(set));(*r)->next=NULL;m=(*p)->next;for(;m;){n=(*q)->next;for(;(m->coef!=n->coef)&&n->next;){n=n->next;}if(!n->next&&(m->coef!=n->coef)) {k=(struct set *)malloc(sizeof(set));k->next=(*r)->next;(*r)->next=k;k->coef=m->coef;}m=m->next;}}//求A-Bvoid bangzhu(void){printf(\\t\t\t***********************************);printf(\\t\t\t* 求集合的交并差*);printf(\\t\t\t*********************************\n);}void main(){struct set *p,*q,*r;int m,n,node;bangzhu();for(;;){do{牰湩晴尨请输入您要选择操作的代码:\n);printf(:求两集合的并A∪B\n);printf(:求两集合的交A∩B\n);printf(:求两集合的差A-B\n); printf(:退出该程序\n);scanf(%d,&node);}while(node<0||node>3);if(node==0) exit(1);printf(\\t\t/*请输入集合A中元素的个数:*/\n);scanf(%d,&m);createlist_p(&p,m);printf(\\t\t/*请输入集合B中元素的个数:*/\n);scanf(%d,&n);createlist_p(&q,n);牰湩晴尨集合A中元素为:);printlist_p(&p);printf( 集合B中元素为:);printlist_p(&q);//while(node<0||node>3);switch(node){case 1: Addset( &p,&q,&r);printf(A∪B:\n);printlist_p(&r);break; B:\n);printlist_p(&r);break; ∩case 2: Subset( &p,&q,&r);printf(A.case 3: Intset(&p,&q,&r); printf(A-B:\n);printlist_p(&r);break;}printf(\);}}//---------------------------------------------------------------------------。

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

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语言程序[离散数学集合运算C或C语言实验报告范文]

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]

离散数学c语言程序[离散数学集合运算C或C语言实验报告范文]实验成绩:202212202201016学号:【实验题目】1.命题逻辑实验四【实验目的】2.掌握用计算机求集合的交、并、差和补运算的方法。

【实验内容】3.编程实现集合的交、并、差和补运算。

【实验要求】4、++语言编程实现C或C【算法描述】5.10},,,9,6,7,,C,E表示集合。

假定A={1,34,5,(1)用数组AB10},9,,8,7,4,5,6,34B={2,,3,,7,8,10},E={1,2,,输入数据时要求检查数据是否重复(集合中的E(全集),B,输入数组A 的子集。

B是集合E,要求集合数据要求不重复)A,置成空集。

以下每一个运算都要求先将集合CB}且某)二个集合的交运算:AB={某|某A(2C中的元素进行比较,将相同的元素放在数组中元素逐一与数组B把数组AB的交。

便是集合中,数组CA和集合C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]==b[j])c[k++]=a[i];B}或某3)二个集合的并运算:AB={某|某A(中中的元素逐一与数组AC中。

将数组B中各个元素先保存在数组把数组AB和集合C便是集合A 的元素进行比较,把不相同的元素添加到数组C中,数组的并。

C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]==c[j])break;if(j==m){c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={某|某A且某B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。

C语言算法:for(j=0;j<m;j++){for(i=0;i<n;i++){if(A[j]==B[i]){C[k]=A[j];k++;break;}if(j==n){C[k]=A[i];k++;}}A}且~A=B-A={某|某B某)集合的补运算:(5把不相同的元素保存到中的元素进行比较,E中的元素逐一与数组A将数组关于集合中,数组数组CC便是集合AE的补集。

C语言集合的实现

C语言集合的实现

C语言集合的实现C语言是一种通用的程序设计语言,提供了丰富的数据结构和算法库。

在C语言中,集合是一种存储不重复元素的数据结构,常用于需要存储、查询和操作一组不同元素的场景。

本文将介绍C语言中集合的实现方式,并详细解释其原理和应用。

1.集合的定义集合是一种不包含重复元素的容器,没有特定的顺序。

在C语言中,可以使用数组或链表等数据结构来实现集合。

集合通常有以下几个基本操作:插入元素、删除元素、判断元素是否存在、求并集、求交集、求差集等。

2.集合的实现方式2.1使用数组实现集合使用数组实现集合比较简单,只需要定义一个固定大小的数组,然后使用元素的值作为下标来标记元素是否存在。

例如,要存储范围在0-9之间的整数集合,可以定义一个大小为10的数组,数组下标代表元素值,数组元素的值用于表示元素是否存在。

下面是使用数组实现集合的示例代码:```c#define SIZE 10//初始化集合void initSet(int set[])for (int i = 0; i < SIZE; i++)set[i] = 0;}//插入元素void insertElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 1;}//删除元素void deleteElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 0;}//判断元素是否存在int isElementExist(int set[], int element) if (element >= 0 && element < SIZE)return set[element];} elsereturn 0;}//打印集合void printSet(int set[])for (int i = 0; i < SIZE; i++) if (set[i] == 1)printf("%d ", i);}}int maiint set[SIZE];initSet(set);insertElement(set, 1); insertElement(set, 3); insertElement(set, 5); deleteElement(set, 3);printf("集合中的元素为:"); printSet(set);return 0;```这段代码中,先定义了一个大小为10的数组作为集合的存储空间。

c语言的集合的交并补

c语言的集合的交并补
bianli(bing, num2);
printf("}\n");
printf("A-B={");
bianli(bu, num3);
printf("}\n");
return 0;
}
通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。从程序完善性上考虑,集合元素输入时,要有检查元素重复的功能。集合可以用数组也可以用链表存储。
输入: A={1,2,3,4,5} B={3,4,5,6,7}
输出 A交B={3, 4, 5}
A并B={1,2,3,4,5,6,7}
}
}
int main(){
int c;
int a[N],count1,b[N],count2;//a,b两个集合,以及数量
int jiao[N],bing[2*N],bu[N];//交并补三个集合
int num1=0,num2=0,num3=0;
printf("请输入第一个集合:\n");
for(int i=0;i<N;i++){
for(int i=0;i<=count1;i++){//用b数组遍历bing
for(int j=0;j<=count2;j++){
if(b[i]==bing[j])
break;
if(j==count2)
bing[num2++]=b[i];
}
}
//求a对b的补集
for(int i=0;i<=count1;i++){
for(int j=0;j<=count2;j++){

离散数学 实验四 编程实现集合的交、并、差和补运算。

离散数学 实验四 	编程实现集合的交、并、差和补运算。

离散数学实验报告专业班级:姓名:学号:实验成绩:1.【实验题目】集合运算2.【实验目的】编程实现集合的交、并、差和补运算。

3.【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。

4. 【实验要求】通过以下界面提示实现相应的集合运算**************************************************************** 请分别输入集合A与集合B的元素:请选择(1—5)要进行的集合运算:1.集合的交运算(A⋂B)2.集合的并运算(A⋃B)3.集合的差运算(A-B)4.集合的补运算(~A=E-A)5.继续/退出(y/n)****************************************************************5. 【算法描述】(1)用数组A,B,C,E表示集合。

假定A={1,3,4,5,6,7,9,10}, B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10}, 输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。

以下每一个运算都要求先将集合C置成空集。

(2)二个集合的交运算:A⋂B={x|x∈A且x∈B}把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C 中,数组C便是集合A和集合B的交。

C语言算法:for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i]= =b[j]) c[k++]=a[i];(3)二个集合的并运算:A⋃B={x|x∈A或x∈B}把数组A中各个元素先保存在数组C中。

将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B 的并。

C语言算法:for(i=0;i<m;i++)c[i]=a[i];for(i=0;i<n;i++){for(j=0;j<m;j++)if(b[i]= =c[j]) break;if(j= =m){ c[m+k]=b[i];k++;}}(4)二个集合的差运算:A-B={x|x∈A且x∉B}将数组A中的元素逐一与数组B中的元素进行比较,把数组A与数组B不同的元素保存在数组C中,数组C便是集合A和集合B的差A-B。

C语言关系运算及关系代数


Product)
ABC R a1 b1 c1
a1 b2 c2 a2 b2 c1
AB CA BC
a1 b1 c1 a1 b2 c2 a1 b1 c1 a1 b3 c2 a1 b1 c1 a2 b2 c1 R × S a1 b2 c2 a1 b2 c2
a1 b2 c2 a1 b3 c2
* A B C 广义笛a1 卡b2 尔c2 积a2 (b续2 c)1
*概述(续)
*(3) tr ts
R为n目关系,S为m目关系。tr R,tsS, tr ts称为元组的连接。 它是一个n + m列的元组,前n个分量为R中的一个n元组,后m个 分量为S中的一个m元组。
*概述(续)
* 4)象集Zx
给定一个关系R(X,Z),X和Z为属性组。 当t[X]=x时,x在R中的象集(Images Set) 为:
运算对象:关系 运算结果:关系 运算符:四类
*概述(续)
*集合运算符
* 将关系看成元组的集合 * 运算是从关系的“水平”方向即行的角度来进行
*专门的关系运算符
* 不仅涉及行而且涉及列
*算术比较符
* 辅助专门的关系运算符进行操作
*逻辑运算符
*概述(续)
* 辅助专门的关系运算符进行操作
概述(续)
表 关系代数运算符
* 仍为n目关系,由属于R或属于S的元组组成
R∪S = { t|t R∨t S }
*1. 并(Union)
ABC R a1 b1 c1
a1 b2 c2 a2 b2 c1 ABC S a1 b2 c2 a1 b3 c2 a2 b2 c1
ABC R∪S a1 b1 c1
aa11*并bb32(续cc22)

国家计算机二级考试C语言公共基础最新题库—数据库设计基础

1.在数据库设计中,将E-R图转换成关系数据模型的过程属于()。

答案:CA)需求分析阶段B)概念设计阶段C)逻辑设计阶段D)物理设计阶段本题答案为:C题目解析:E-R图转换成关系模型数据则是把图形分析出来的联系反映到数据库中,即设计出表,所以属于辑设计阶段。

2.A)并B)自然连接C)笛卡尔积D)交本题答案为:D题目解析:自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以B)错误。

笛卡尔积是用R集合中元素为第一元素,S集合中元素为第二元素构成的有序对,所以C)错误。

根据关系T可以很明显的看出是从关系R与关系S中取得相同的关系组所以取得是交运算,选择D)。

3.设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份证号),课程C(课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为()。

答案:C A)课号,成绩B)学号,成绩C)学号,课号D)学号,姓名,成绩本题答案为:C题目解析:学号是学生表S的主键,课号是课程表C的主键,所以选课表SC的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课号,所以选择C)。

4.一间宿舍可住多个学生,则实体宿舍和学生之间的联系是()。

答案:BA)一对一B)一对多C)多对一D)多对多本题答案为:B题目解析:因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。

5.A)笛卡尔积B)交C)并D)自然连接本题答案为:D题目解析:自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据T关系中的有序组可知R与S进行的是自然连接操作。

6.数据库应用系统中的核心问题是()。

答案:AA)数据库设计B)数据库系统设计C)数据库维护D)数据库管理员培训本题答案为:A题目解析:数据库应用系统中的核心问题是数据库的设计。

差集运算实验报告

一、实验目的1. 理解差集运算的概念和性质。

2. 掌握使用C语言实现差集运算的方法。

3. 通过实验加深对集合运算的理解,提高编程能力。

二、实验原理差集运算,也称为集合的减法运算,是指从一个集合中去除另一个集合中包含的元素,得到的结果称为差集。

假设有两个集合A和B,A-B表示从集合A中去除所有属于集合B的元素,得到的集合称为A与B的差集。

差集运算的性质如下:1. 交换律:A-B = B-A2. 结合律:(A-B)-C = A-(B∪C)3. 分配律:A-(B∪C) = (A-B)∩(A-C)三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019四、实验步骤1. 定义差集运算函数:实现差集运算的核心是定义一个函数,该函数接收两个集合作为参数,返回它们的差集。

```cvoid differenceSet(int setA, int setASize, int setB, int setBSize, int result, int resultSize) {int i, j, k = 0;for (i = 0; i < setASize; i++) {int flag = 0;for (j = 0; j < setBSize; j++) {if (setA[i] == setB[j]) {flag = 1;break;}}if (flag == 0) {result[k++] = setA[i];}}resultSize = k;}```2. 创建两个集合:为了进行差集运算,我们需要创建两个集合A和B,并分别存储它们的元素。

```cint setA[] = {1, 2, 3, 4, 5};int setB[] = {4, 5, 6, 7, 8};int setASize = sizeof(setA) / sizeof(setA[0]);int setBSize = sizeof(setB) / sizeof(setB[0]);```3. 计算差集:调用差集运算函数,计算集合A与B的差集。

离散数学(集合的运算)实验报告

大连民族学院计算机科学与工程学院实验报告实验题目:集合的运算课程名称:离散数学实验类型:□演示性□验证性□操作性□设计性□综合性专业:网络工程班级:网络111班学生姓名:张山学号:2011083123实验日期:2013年12月22日实验地点:I区实验机房实验学时:8小时实验成绩:指导教师签字:年月日老师评语:实验题目:集合的运算实验原理:1、实验内容与要求:实验内容:本实验求两个集合间的运算,给定两个集合A、B,求集合A与集合B之间的交集、并集、差集、对称差集和笛卡尔乘积。

实验要求:对于给定的集合A、B。

用C++/C语言设计一个程序(本实验采用C++),该程序能够完成两个集合间的各种运算,可根据需要选择输出某种运算结果,也可一次输出所有运算结果。

2、实验算法:实验算法分为如下几步:(1)、设计整体框架该程序采取操作、打印分离(求解和输出分开)的思想。

即先设计函数求解各部分运算并将相应结果传入数组(所求集合)中,然后根据需要打印运算结果。

(2)、建立一个集合类(Gather)类体包括的数组a、b、c、d、e、f、g分别存储集合A、B以及所求各种运算的集合。

接口(实现操作的函数)包括构造函数,菜单显示函数,求解操作函数,打印各种运算结果等函数。

(3)、设计类体中的接口构造函数:对对象进行初始化,建立集合A与集合B。

菜单显示函数:设计提示选项,给使用者操作提示。

操作函数:该函数是程序的主题部分,完成对集合的所有运算的求解过程,并将结果弹入(存入)对应数组(集合)中,用于打印。

具体操作如下:1*求交集:根据集合中交集的定义,将数组a、b中元素挨个比较,把共同元素选出来,并存入数组c(交集集合)中,即求得集合A、B的交集。

2*求并集:根据集合中并集的定义,先将数组a中元素依次存入数组g(并集集合)中,存储集合A中某元素前,先将其与已存入g中的元素依次比较,若相同则存入下一个元素,否则直接存入g中,直到所有A中元素存储完毕。

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

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

先定义集合的数据类型notes.h
//notes.h
typedef struct LNode...{
ElemType data;
LNode *next;
}*Link, *Position;
typedef struct...{
Link head,tail;
int len;
}LinkSet;
//~
2。

以后要用的一些常量放在constValues.h
#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; //函数的返回值//~
3。

集合实现函数setsFun.h
/**//****************** 函数定义*********************/ Status InitSets(LinkSet &ls)...{
//初始化集合
ls.head = (Link) malloc( sizeof(Link));
ls.tail = (Link) malloc( sizeof(Link));
if(!ls.head || !ls.tail) exit(OVERFLOW); //如果分配失败
ls.head->next = ls.tail->next = NULL; //头、尾指针为空
ls.len = 0; //长度为0
return OK;
}
Status CreateNode(Link &link,ElemType e)...{
//创建一节点,内容为e
link = (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;。

相关文档
最新文档