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语言中,我们可以使用数组来表示集合。
数组是一种非常基础的数据结构,它由相同类型的元素组成的有序集合。
我们可以通过定义数组来表示一个集合,并通过遍历数组来进行各种集合运算。
三、集合的并集运算集合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语言实验报告范文]](https://img.taocdn.com/s3/m/77acf7cdba4cf7ec4afe04a1b0717fd5360cb2f8.png)
离散数学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语言中集合的实现方式,并详细解释其原理和应用。
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语言的集合的交并补

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的差集。
练习二

综合练习二一、选择题1.对关系模型叙述错误的是____。
A、建立在严格的数学理论、集合论和谓词演算公式的基础之上B、微机DBMS绝大部分采取关系数据模型C、用二维表表示关系模型是其一大特点D、不具有连接操作的DBMS也可以是关系数据库系统2.关系数据库管理系统应能实现的专门关系运算包括____。
A、排序、索引、统计B、选择、投影、连接C、关联、更新、排序D、显示、打印、制表3.关系模型中,候选码____。
A、可由多个任意属性组成B、至多由一个属性组成C、可由一个或多个其值能惟一标识该关系模式中任何元组的属性组成D以上都不是4.在一个关系中如果有这样一个属性存在,它的值能惟一地标识关系中的每一个元组,称这个属性为____。
A、候选码B、数据项C、主属性D、主属性值5.同一个关系模型的任两个元组值____。
A、不能全同B、可全同C、必须全同D、以上都不是6.在通常情况下,下面的关系中不可以作为关系数据库的关系是____。
A、R1(学生号,学生名,性别)B、R2(学生号,学生名,班级号)C、R3(学生号,学生名,宿舍号)D、R4(学生号,学生名,简历)7.一个关系数据库文件中的各条记录____。
A、前后顺序不能任意颠倒,一定要按照输人的顺序排列B、前后顺序可以任意颠倒,不影响库中的数据关系C、前后顺序可以任意颠倒,但排列顺序不同,统计处理的结果就可能不同D、前后顺序不能任意颠倒,一定要按照候选码字段值的顺序排列8.在关系代数的传统集合运算中,假定有关系R和S,运算结果为W。
如果W中的元组属于R,或者属于S,则W为①运算的结果。
如果W中的元组属于R而不属于S,则W为②运算的结果。
如果W中的元组既属于R又属于S,则W为③运算的结果。
A、笛卡尔积B、并C、差D、交9.在关系代数的专门关系运算中,从表中取出满足条件的属性的操作称为①;从表中选出满足某种条件的元组的操作称为②;将两个关系中具有共同属性值的元组连接到一起构成新表的操作称为③。
c语言实现集合的交叉并运算

c语言实现集合的交叉并运算集合是数学中的一个重要概念,它指的是一组具有共同特征的元素的整体。
在数学中,我们经常需要对集合进行交叉并运算,以求得集合之间的关系。
在本文中,我们将使用C语言来实现集合的交叉并运算。
我们需要定义集合的数据结构。
在C语言中,我们可以使用数组来表示集合。
假设我们要操作的集合元素类型为整数,那么我们可以定义一个整型数组来表示集合。
例如,我们可以定义一个名为set1的数组来表示集合A,一个名为set2的数组来表示集合B。
接下来,我们需要编写函数来实现集合的交叉并运算。
首先,我们来实现交集运算。
交集运算指的是找出两个集合中共有的元素。
我们可以通过遍历集合A中的每一个元素,然后与集合B中的每一个元素进行比较,如果找到相同的元素,则将该元素添加到交集的数组中。
具体代码实现如下:```cvoid intersection(int set1[], int set2[], int len1, int len2, int result[], int *len_res) {int i, j;*len_res = 0;for (i = 0; i < len1; i++) {for (j = 0; j < len2; j++) {if (set1[i] == set2[j]) {result[*len_res] = set1[i];(*len_res)++;break;}}}}```上述代码中,我们通过两个嵌套的循环来遍历集合A和集合B,如果找到相同的元素,则将其添加到交集的数组中,并更新交集数组的长度。
接下来,我们来实现并集运算。
并集运算指的是将两个集合中的所有元素合并成一个新的集合。
我们可以通过遍历集合A和集合B,将它们的所有元素依次添加到新的集合中。
具体代码实现如下:```cvoid unionSet(int set1[], int set2[], int len1, int len2, int result[], int *len_res) {int i;*len_res = 0;for (i = 0; i < len1; i++) {result[*len_res] = set1[i];(*len_res)++;}for (i = 0; i < len2; i++) {int j;for (j = 0; j < len1; j++) {if (set2[i] == set1[j]) {break;}}if (j == len1) {result[*len_res] = set2[i];(*len_res)++;}}}```上述代码中,我们首先将集合A中的所有元素添加到新的集合中,然后遍历集合B中的每一个元素,如果该元素不在集合A中,则将其添加到新的集合中。
并集、交集、差集

2.3.2、使用difference()方法进行差集运算
同理,使用difference()方法进行集合B和集合A的差 集也是不同的
2.4、集合的对称差集运算方法
集合的差集运算也有两种方式:
一种是使用“^”运算符进行操作
另一种是使用symmetric_difference()方法来实现。
2.4.2、使用symmetric_difference()方法进 行对称差集运算
A = {'语文','数学','英语','政治','历史','地理’} B = {'语文','数学','英语','物理','化学','生物'}
2.1、集合的交集运算方法
我们使用集合的交集运算的时候可以采用两种方式:
“&” 一种是使用
运算符进行操作,
另一种是使用intersection()方法来实现
结论:
集合中进行交集、并集、对称差集进行运算的时候, 集合A与集合B,位置替换的时候,结果相同。
集合中进行差集运算的时候,集合A与集合B,位置替 换的时候,结果不同,为的含义:
给定两个集合A、B,把他们所有的元素合并在一起组 成的集合,叫做集合A与集合B的并集。 在Python中,进行并集运算时使用“|”符号。
Seta={1,2,3} Setb={4,5,6} Setc={1,2,3,4,5,6}
1.3、集合的差集的含义: 设A,B是两个集合,则所有属于A且不属于B的元素构 成的集合,叫做集合A与集合B的差集。 在Python中,进行差集运算时使用“-”符号
集合的并、交运算C语言

集合的并、交运算(C语言) 在C语言中,可以使用逻辑运算符和位运算符来实现集合的并、交运算。
首先,我们需要定义两个布尔类型的数组来表示两个集合。
假设我们有两个集合A和B,它们的元素都是0或1,其中0表示该位置不属于该集合,1表示该位置属于该集合。
我们可以使用以下代码来定义两个集合:int A[10] = {0, 1, 0, 0, 1, 1, 0, 1, 0, 0}; // 集合Aint B[10] = {0, 0, 1, 0, 1, 0, 1, 1, 0, 0}; // 集合B接下来,我们可以使用逻辑运算符来实现集合的并、交运算。
1.并运算并运算即将集合A和集合B的所有元素合并成一个新的集合。
我们可以使用逻辑运算符“|”来实现并运算,代码如下:int C[10]; // 新集合Cfor (int i = 0; i < 10; i++) {C[i] = A[i] | B[i]; // 并运算}在上面的代码中,我们使用循环遍历所有元素,对于每个元素,如果它属于集合A或集合B,则将它赋值给新集合C。
这里使用了逻辑运算符“|”,表示两个集合的并运算。
2.交运算交运算即找出集合A和集合B中共有的元素组成一个新的集合。
我们可以使用逻辑运算符“&”来实现交运算,代码如下:int D[10]; // 新集合Dfor (int i = 0; i < 10; i++) {D[i] = A[i] & B[i]; // 交运算}在上面的代码中,我们同样使用循环遍历所有元素,对于每个元素,如果它既属于集合A又属于集合B,则将它赋值给新集合D。
这里使用了逻辑运算符“&”,表示两个集合的交运算。
需要注意的是,在实际应用中,我们可能需要对数组进行动态分配内存,以适应不同大小的集合。
此外,我们还需要注意数组下标从0开始计数的问题。
集合的交,并,差操作

目录序言 (1)中文摘要 (2)1.采用类C语言定义相关数据类型 (3)2.各模块流程图及伪码算法 (4)3.函数的调用关系图 (12)4.调试分析 (13)5.测试结果 (14)6.设计总结 (19)参考文献 (20)致谢 (21)附录(源程序) (22)序言云计算来袭,计算机技术的飞速发展,给我们的生活带来了很大的便利,特别是对于数学运算,一些以前人工计算很麻烦的甚至做不出的问题,计算机在几秒钟就可以算出来。
毫无疑问,计算机技术的应用已是不可阻挡的。
这里我们要做的是集合的简单操作,包括集合的交、并、差。
经过分析,我们使用已经为业界所公认的成熟的稳定的开发工具VC6.0,利用其提供的简单操作,首先在短时间内建立程序原形,然后,对初始原型程序需求分析,编写源程序,不断修正和改进,直到形成满足要求的可行程序。
集合的操作是数据结构中最简单的操作,对集合的学习实践可以帮助我们加深对数据结的掌握程度。
本程序是用单链表的基本操作升华到集合上的操作,来实现集合运算。
中文摘要利用单链表的插入删除操作进一步升华到求两个集合的交、并、差,笛卡尔积等运算。
在Visual C++6.0中实现程序的编译,调试,运行,利用随机数验证并输出这个程序的结果。
通过该题目的设计过程,可以进一步理解和熟练掌握课本中所学的各种数据结构的知识,加深对链表的认识,特别是对于指针、文件的应用,有了更多的认识。
学会如何把学到的知识用于解决实际问题,培养自己的动手能力。
关键词:集合;链表;指针;随机数;文件;1.采用类C语言定义相关数据类型定义单链表typedef struct ListNode{int data; //集合中元素的值struct ListNode *next;//集合的指针域}ListNode,*LinkList;//结点,结构体指针2.各模块流程图及伪码算法建立链表模块LinkList CreateSet(LinkList L) {LinkList p = L,q = NULL;//读取产生的随机数作为集合的元素 FILE *rfile;rfile = fopen("jihe.txt","rb"); if ( rfile == NULL ) { printf("open data.txt error.");return 0;Linklist p,q从文件中读取数据成功randomm()否打开文件失败把生成的随机数读取到文件中fread ()是结束}int rs = 0;int rra[20] = {0};rs = fread(rra, sizeof(int),20,rfile);for ( int j = 0 ; j < rs; j++){q = NULL;q = (LinkList)malloc(sizeof(ListNode));q->next=NULL;q->data = rra[j]; //读取元素值p->next = q;p = p->next;}//forfclose(rfile);return L;}计算集合并的函数模块//求并集LinkList Union(LinkList A,LinkList B,LinkList C) {LinkList pa, pb, pc,tail; pa = A->next; pb = B->next; tail = C; while(pa && pb) { if((pa->data) <= (pb->data)){pc = (LinkList)malloc(sizeof(ListNode)); LinkList pa, pb, pc,tail;pa!=null &&pb!=nullpa->data<=pb->datapc->data = pa->datapc->data = pb->data结束否否是是pc->data = pa->data;pc->next=tail->next;tail->next = pc;tail = pc;pc = pc->next;pa = pa->next;}//ifelse{pc = (LinkList)malloc(sizeof(ListNode));pc->data = pb->data;pc->next=tail->next;tail->next = pc;tail = pc;pc = pc->next;pb = pb->next;}//else}if(pa == NULL){pc = pb;tail->next = pc;tail = pc;}//ifelse{pc = pa;tail->next = pc;tail = pc;}//else}//whilereturn(C);}计算集合交的函数模块//求交集LinkList Intersection(LinkList A,LinkList B,LinkList L) {ListNode *pa, *pb, *pc,*tail; tail = L; pa = A->next; pb = B->next; while (pa && pb) { if (pa->data < pb->data) {pa = pa->next;LinkList pa, pb, pc,tail;pa!=null &&pb!=nullpa->data==pb->datapc->data = pa->data释放pa,pb结束否否是是}//ifelse if (pa->data > pb->data){pb = pb->next;}//else ifelse{pc = (LinkList)malloc(sizeof(ListNode));pc->data = pa->data;pc->next=tail->next;tail->next = pc;tail = pc;pc = pc->next;pa = pa->next;pb = pb->next;}//else}//whilereturn L;}计算集合1与集合2的差 的函数模块//求差集LinkList Difference(LinkList A,LinkList B,LinkList C) {LinkList pa, pb, pc; pa = A->next; pb = B->next; pc = A;while(pa && pb) { if (pa->data != pb->data) {pc->next = pa;LinkList pa, pb, pc,tail;pa!=null &&pb!=nullpa->data !=pb->datapc->data = pa->data释放pa,pb结束否否是是pc = pa;pa = pa->next;}//ifelse{pa = pa->next;pb = pb->next;}//else}//whilereturn A;}3.函数的调用关系图main()menu_select()CreateSet CreateSet2 Difference Union Intersection PrintSet4.调试分析a.调试中遇到的问题及对问题的解决方法调试中遇到的问题中主要是内存泄露问题,指针何时分配空间何时释放空间没有搞清楚,还有随机数产生完成后不知道怎么读入到链表中,对于这些问题,我上网查阅相关的资料,来进一步的确定问题的本质,从而解决问题的每一步。
c语言实现的链表集合的并集与交集

#include<stdlib.h> #include<stdio.h>typedefintDatatype;//定义链表的节点typedefstructLNode{Datatype data;LNode *next;}LNode,*LinkList;boolInitLink(LinkList&L) //初始化链表{L =(LinkList)malloc(sizeof(LNode));if(L==NULL){return false;}L->next=NULL;return true;}boolInsertData(LinkList&L,Datatype data) //向链表中插入数据{ LinkList pa=L;while(pa->next!=NULL){pa=pa->next;}LinkList p=(LinkList)malloc(sizeof(LNode));//新建数据节点if(p==NULL){printf("插入数据失败\n");return false;}p->data=data;p->next=NULL;if(pa==NULL){pa=p;}else{pa->next=p;}return true;}void createLink(LinkList&L){printf("请输入要插入的数据,以0结束!\n"); Datatype data;scanf("%d",&data);while(data!=00){InsertData(L,data);scanf("%d",&data);}}void printLink(LinkList L)//打印链表{LinkList p=L->next;while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}bool merger(LinkListLa,LinkListLb,LinkList&Lc)//两个链表求并集,并将结果存放在Lc中{LinkListpa,pb;pb=Lb->next; //用于循环pa=La->next;while(pa!=NULL){ //以La为基础链,若B中的数据在A链中不存在,则插入到Lc中InsertData(Lc,pa->data);pa=pa->next; //pos表示la链中最后一个数据节点,用于插入数据}bool flag=false;while(pb!=NULL){pa=La->next;flag=false; //用于判断B中的数据是否在A中存在while(pa!=NULL){if(pa->data==pb->data){flag=false;break; //如果存在,则本次循环结束}else{flag=true;}pa=pa->next; //pa向后移动}if(flag){/* LinkList p=(LinkList)malloc(sizeof(LNode)); //注释的代码是用于将A和B合并之后存放在A中if(p==NULL){printf("插入数据失败\n");return false;}p->data=pb->data;p->next=NULL;pos->next=p;pos=p;*/InsertData(Lc,pb->data); //将B中的数据插入到Lc中}pb=pb->next;}return true;}bool Intersection(LinkListLa,LinkListLb,LinkList&Lc)//两个链表求交集,结果存放在Lc中{LinkListpa,pb;pb=Lb->next;while(pb!=NULL){pa=La->next;while(pa!=NULL){if(pa->data==pb->data){ //求交集时,只需找到两个链中共同的数据,插入到Lc中即可InsertData(Lc,pa->data);}pa=pa->next;}pb=pb->next;}return true;}int main(){LinkListLa,Lb,Lc;if(!InitLink(La)){printf("初始化链表失败");exit(1);}if(!InitLink(Lb)){printf("初始化链表失败"); exit(1);}if(!InitLink(Lc)){printf("初始化链表失败"); exit(1);}printf("创建第一条链表\n"); createLink(La);printf("创建第二条链表\n"); createLink(Lb);printf("链表中的数据为\n"); printf("La: ");printLink(La);printf("Lb: ");printLink(Lb);printf("链表求并集\n");merger(La,Lb,Lc);printf("合并之后链表中的数据为\n"); printLink(Lc);printf("链表求交集\n");if(!InitLink(Lc)){printf("初始化链表失败");exit(1);}Intersection(La,Lb,Lc);printf("求交之后链表中的数据为\n"); printLink(Lc);return(0);}。
C语言实现集合的交,并,差

}
return OK;
}
Status IntersectionSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{
//已知集合ls1,ls2的元素按值非递减排列
//将集合ls1,ls2的交集到ls3
ls.tail = (Link) malloc( sizeof(Link));
if(!ls.head || !ls.tail) exit(OVERFLOW); //如果分配失败
ls.head->next = ls.tail->next = NULL; //头、尾指针为空
ls.len = 0; //长度为0
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...{
}
return OK;
}
Status DifferenceSets(LinkSet &lsa,LinkSet &lsb, LinkSet &lsc)...{
//已知集合ls1,ls2的元素按值非递减排列
//ls3 = ls1 - ls2
if( !InitSe h->next;
}
printf(" ] ");
return OK;
}
数据结构课程设计报告---单链表表示集合---实现交并差

西安建筑科技大学华清学院课程设计(论文)题目:院(系):专业班级:计算机姓学名:号:指导教师:2016 年9 月8 日西安建筑科技大学华清学院课程设计(论文)任务书专业班级:学生姓名:指导教师(签名):一、课程设计(论文)题目集合运算:使用链表来表示集合,完成集合的合并,求交集等操作。
二、本次课程设计(论文)应达到的目的数据结构是实践很强的课程,课程设计是加强学生实践能力的一个强有力的手段。
课程设计要求我们完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于我们基本程序素养的培养和软件工作者工作作风的训练。
将起到显著的促进作用。
本题目要达到目的:熟练掌握链表的各种操作三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参数、设计要求等)输入数据:输入10个以内的字符进行程序测试。
1、自己输入两了任意集合。
2、用对话框的形式显示集合运算的结果。
3、优化对话框。
四、应收集的资料及主要参考文献:由于本课程没有安排“课内上机”学时,因此,在课程设计之前必须自己已经上机练习了“线性表”的基本操作。
参考文献:1. 数据结构-C语言描述,西安电子科技大学出版社,2011.5,耿国华编著2.数决结构与算法分析(C++版),电子工业出版社,2005.7,Clifford A.Shaffer 编著3.数据结构与算法,科学出版社,2005.08,赵文静祁飞等编著4.数据结构-C++语言描述,西安交通大学出版社,1999.01,赵文静编著5.VC++深入详解,电子工业出版社,2007.7,孙鑫,于安萍编著五、审核批准意见教研室主任(签字)设计总说明该设计主要应实现以下功能:1.利用尾差法建立单链表2.对于输入的链表进行有序排列3.删除有序链表中不符合要求的元素4.调用函数对单链表进行交,并,差运算,并输出系统主要由8 个模块组成,分别是:1. 单链表的建立2.单链表的有序排列3.删除单链表中不符合条件的元素4.集合交集5.集合并集6.集合差集7.单链表输出8.主函数1.设技种算学其的别的都过理象提的计作用3.需3.13.2可3.3用硬可误5. 概4.1数(1)(2)Check(char ch,LinkList Head):检查p1或p2所指向数据结点该不该加入到Head为起始的集合中(2)Merge(LinkList Head1,LinkList Head2):合并两个集合(4)IsExist(char data,LinkList Head);IsExist2(char data,LinkList Head):集合A中的元素,B中是否存在(5)Deprive(LinkList Head1,LinkList Head2):两个集合的差集(6)Insection(LinkList Head1,LinkList Head2):两个集合交集(7)PrintLinkList(LinkList Head):打印集合元素4.2 系统包含的函数InitLinkList(LinkList Head)Check(char ch,LinkList Head)Merge(LinkList Head1,LinkList Head2)IsExist2(char data,LinkList Head)Deprive(LinkList Head1,LinkList Head2)Insection(LinkList Head1,LinkList Head2)PrintLinkList(LinkList Head)4.3 函数间的关系1.求两个集合的并集时,Merge(LinkListHead1,LinkList Head2)函数首先调用了InitLinkList(LinkList Head)函数,多次调用了Check(char ch,LinkList Head)函数。
C语言数据结构之求两个集合的交集(链表)

C语⾔数据结构之求两个集合的交集(链表)//1:求两集合的交集(链表)。
#include <stdio.h>#include <stdlib.h>struct node{int data;struct node* next;};void push(struct node **head_ref, int new_data); //添加数据元素声明bool isPresent(struct node *head, int data); //判断是否存在函数声明/* struct node *getUnion(struct node *head1, struct node *head2)//求并集函数{struct node *result = NULL;struct node *t1 = head1, *t2 = head2;while(t1 != NULL){push(&result, t1->data);t1 = t1->next;}while(t2 != NULL){if(!isPresent(result, t2->data))push(&result, t2->data);t2 = t2->next;}return result;} */struct node *getIntersection(struct node *head1, struct node *head2) //求交集函数{struct node *result = NULL;struct node *t1 = head1;while( t1 != NULL ){if(isPresent(head2, t1->data))push(&result, t1->data);t1 = t1->next;}return result;}void push(struct node**head_ref, int new_data) //添加数据成员函数{struct node* new_node = (struct node*)malloc(sizeof(struct node));new_node->data = new_data;new_node->next = (*head_ref);(*head_ref) = new_node;}void printList(struct node *node) //输出链表函数{while( node != NULL ){printf("%d ", node->data);node = node->next;}}bool isPresent(struct node *head, int data) //判断是否存在{struct node *t = head;while(t != NULL){if( t->data == data )return 1;t = t->next;}return 0;}int main(){struct node* head1 = NULL;struct node* head2 = NULL;struct node* intersecn = NULL;push (&head1, 20);//链表⼀添加数据元素push (&head1, 4);push (&head1, 15);push (&head1, 10);push (&head2, 10); //链表⼆添加数据元素push (&head2, 2);push (&head2, 4);push (&head2, 8);intersecn = getIntersection (head1, head2);//取交集元素printf ("\n 链表⼀为 \n");printList (head1);printf ("\n 链表⼆为\n");printList (head2);printf ("\n 求交集后 \n");printList (intersecn);printf("\n");return 0;}/*时间复杂度:在这个程序中,链表的并和交操作的时间复杂度都是O(mn),m是链表1的元素个数,n是链表2的元素个素。
c语言集合的交并运算

c语言集合的交并运算C语言是一种广泛应用的编程语言,它提供了丰富的数据结构和操作方法,其中集合的交并运算是C语言中常用的操作之一。
本文将围绕集合的交并运算展开,介绍相关概念、操作方法和实际应用。
一、集合的基本概念在C语言中,集合可以看作是一组具有相同类型的元素的无序集合。
集合中的元素不重复,每个元素都具有唯一的标识。
集合的交运算和并运算是两种常用的操作,下面将详细介绍这两种操作的含义和实现方法。
二、集合的交运算集合的交运算指的是求两个集合中共同存在的元素构成的新集合。
假设集合A和集合B分别为{1, 2, 3, 4}和{3, 4, 5, 6},则它们的交集为{3, 4}。
在C语言中,可以使用循环和条件判断来实现集合的交运算。
具体实现方法如下:1. 定义两个集合A和B,并初始化它们的元素。
2. 创建一个新的集合C,用于存放交集的元素。
3. 使用循环遍历集合A的每个元素,对于每个元素,判断它是否同时存在于集合B中。
4. 如果存在,则将该元素添加到集合C中。
5. 最后,集合C中存放的就是A和B的交集。
三、集合的并运算集合的并运算指的是将两个集合中的所有元素合并成一个新集合。
假设集合A和集合B分别为{1, 2, 3, 4}和{3, 4, 5, 6},则它们的并集为{1, 2, 3, 4, 5, 6}。
在C语言中,可以使用循环和条件判断来实现集合的并运算。
具体实现方法如下:1. 定义两个集合A和B,并初始化它们的元素。
2. 创建一个新的集合C,用于存放并集的元素。
3. 遍历集合A的每个元素,将它们依次添加到集合C中。
4. 遍历集合B的每个元素,对于每个元素,判断它是否已经存在于集合C中。
5. 如果不存在,则将该元素添加到集合C中。
6. 最后,集合C中存放的就是A和B的并集。
四、集合运算的应用集合的交并运算在实际应用中具有广泛的用途。
以下列举几个常见的应用场景:1. 数据去重:当需要对一组数据进行去重操作时,可以将这组数据看作是一个集合,通过求其并集得到去重后的结果。
mypow函数

mypow函数mypow函数是一种功能强大的C语言函数,它可以快速求出数字的幂指数运算结果,因此非常受到开发者和习惯C语言的程序猿的欢迎。
mypow函数的声明部分定义如下:double mypow(double base, int exponent);它接收两个参数,一个double类型的base和一个int类型的exponent,返回值也是一个double类型。
mypow函数的功能主要是返回base的exponent次方的结果,也就是base^exponent。
mypow函数的主要实现方式是递归,也就是说,函数在调用自身的过程中不断的缩小幂次,直至幂次缩小到0,然后把之前的运算结果汇总。
首先,我们考虑exponent为正数的情况,当exponent大于等于1时,递归函数的实现方式为:result = mypow(base, exponent-1) * base;当exponent等于1时,返回base的值:result = base;当exponent为0时,应返回1:result = 1;接下来考虑exponent为负数的情况,同理,当exponent小于等于-1时,可以使用以下公式:result = mypow(base, exponent+1) * 1/base;当exponent等于-1时,返回1/base:result = 1/base;当exponent为0时,应返回1:result = 1;通过mypow函数,我们不仅可以实现数字的幂指数运算,还可以实现数学上的几个概念:如指数级增长、指数衰减等。
比如可以实现数据结构中集合的指数操作,如求幂集合的交、并、补、差等操作;可以实现概率论中伯努利实验中连续多次实验的概率;可以实现数学上的几何指数定律,比如黑体温度的指数衰减;可以实现概率论中贝叶斯公式;可以实现求解积分计算,像泰勒公式求积分等。
总结来说,mypow函数是一种功能强大的C语言函数,它不仅可以求幂指数,还可以实现数学中的几个概念,因此非常方便和实用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;
#define ElemType
int
//存放数据的类型
typedef int Status; //~ 3。集合实现函数
setsFun.h
//函数的返回值
/**//****************** 函数定义 *********************/ Status InitSets(LinkSet &ls)...{
}
Status PrintSets(LinkSet &ls)...{ //打印集合 Link h=ls.head->next; printf("[ "); while(h)...{ printf("%c ",h->data); h = h->next; } printf(" ] "); return OK;
typedef struct LNode...{
ElemType data;
LNode
*next;
}*Link, *Position;
typedef struct...{
Link head,tail;
int
len;
}LinkSet;
//~ 2。以后要用的一些常量放在
#include<stdio.h>
}
ElemType GetCurElem(Link &link)...{ //获得当前节点的数据 return link->data;
}
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; p->next = link; ls.len++; return OK;
//h1:前一节点,h2:前一节点的后一
if(link->data < h1->data) return ls.head;
//如果比第一个节点小,返回头指针
while(h1 && h2)...{ if(h1->data < (link->data) && h2->data > (link->data) )
//初始化 集合 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 = ls.len = 0; return OK; }
【问题描述】 编制一个能演示执行集合的并、交和差运算的程序
【基本要求】 (1)集合的元素限定为小写字母字符[ 'a'......'z' ] (2 )演示程序以用户和计算机对话的方式执行
【测试数据】
【实现提示】 以有序链表表示集合
【代码过程】 1。先定义 集合的数据类型 notes.h
//notes.h
NULL;
//头、尾指针为空 //长度为 0
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 GetHead(LinkSet &ls)...{ //获得集合的头节点 return ls.head;
}
Position NextPos(Link &link)...{
//获得当前节点的下一个节点 return link?link->next:link; }
Status Empty(LinkSet &ls)...{ //空为真 return ls.head->next==NULL;
找到插入的地方了
//如果>h1 && <h2,说明
break;
if(h1->data == (link->data) || h2->data ==(link->data) )
return NULL;
//如果重复,返回节点
h1=h2,h2=h1->next;
}
#include <malloc.h>
#include <stdlib.h> //函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK
1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
constValues.h
}
//如果集合中已有相应元素 //如果前一节点为尾节点,修改 tail
Position PriorNode(LinkSet &ls, Link &link)...{ //返回集合中 该节点的前一节点,不存在返回 NULL int 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;
}
//值设定 //指向空
Position PriorInsertNode(LinkSet &ls,Link &link)...{ //找出节点 link 要插入到 ls 的前一个节点
if(!ls.head->next) return ls.head; Link h1 = ls.head->next, h2 = h1->next; 节点