题目:以顺序表表示集合,编制一个能演示执行集合的并、交、差、补运算的程序。
(1)集合的元素限定为小写字母字符(a'.z),集合输入的形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序应能自动滤去。输出的运算结果字符串中将不含重复字符和非法字符。
(2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据(滤去输入中的非法字符)和运算结果显示在其后。
(3)程序执行的命令应包括:1.构造集合1、 2.构造集合2、3.求并集、4.求交集、5.求差集、6.求补集、7.退出。
(4)测试数据
1.set1=”abcd”,set2=”bcdef”,
交集:”bcd”,并集:”abcdef”。
1.set1=”10efg”,set2=”bcdef”,
交集:”ef”,并集:”bcdefg”。
- 概要设计(20分)
为了实现上述程序功能,应以有序表表示集合。为此,需要两个抽象数据类型:有序表和集合。
1.有序表的抽象类型定义为:
ADT OrderedList {数据对象:D={ai|ai∈CharSet,i=1,2,⋯,n,n≥1}
数据关系:R1={<ai−1,ai>|ai−1,ai∈D,ai−1≤ai,i=1,2,…,n}
基本操作:
Init(List *L)操作结果:构造一个空的有序表L。
Create(List *L)操作结果:创建一个顺序表来表示集合,顺序表无重复元素。
Insert(List *L,i,e)
初始条件:该元素不是重复元素。
操作结果:往线性表中指定位置插入相应元素。
2.集合的抽象数据类型定义为:
ADT Set{
数据对象:为小写英文字母且互不相同,i=1,2,…,n1≤n≤26}
数据关系: R1={}
基本操作:
bing(&T, S1, S2)
初始条件:集合 S1和S2存在。
操作结果:生成一个由S1 和S2 的并集构成的集合T。
jiao(&T, S1, S2)
初始条件:集合S1和S2存在。
操作结果:生成一个由 S1和S2的交集构成的集合T。
Cha(&T, S1, S2)
初始条件:集合 S1和S2存在。
操作结果:生成一个由 S1和S2的差集构成的集合T。
Bu(S1, S)
初始条件:集合 S1和S存在。
操作结果:集合S为全集,求出S1的补集。
1.求交集
status jiao(List la, List lb,List *lc) { //求交集
int i,j,count = 0;
for (i = 0; i < la.Length; i++) {
for (j = 0; j < lb.Length; j++) {
if (la.data[i] == lb.data[j]) {
count++;
insert(lc,count,la.data[i]);
}
}
}
lc->data[count]='\0';
}
2.求并集
status bing(List la, List lb,List *lc) { //求并集
int flag,i,j;
int count = lb.Length;
lc->Length = 0;
strcpy(lc->data, lb.data);
lc->Length = lb.Length;
for (i = 0; i < la.Length; i++) {
flag = 1;
for (j = 0; j < lb.Length; j++) {
if (la.data[i] == lb.data[j]) {
flag = 0;
}
}
if (flag == 1) {//flag==1表示该元素不是重复元素 ,是集合A特有的元素
count++;
insert(lc,count,la.data[i]);
}
}
lc->data[count]='\0';
}
3.求差集la-lc
status cha(List la, List *lc) { //求差集
int i=0, j=0, flag=1;
int count = 0;
List listc;
init(&listc);//构建顺序表listc
for (i = 0; i < la.Length; i++) {
for (j = 0; j < lc->Length; j++) {
if (la.data[i] == lc->data[j]) { flag = 0; break;}
}
if (flag==1) {//flag==1表示该元素不是重复元素,是la特有的元素
count++;
insert(&listc,count,la.data[i]);
}
flag=1;
}
listc.data[listc.Length]='\0';
printf("所求差集Lc为:");
puts(listc.data);
printf("所求差集Lc长度为: %d\n", listc.Length);
}
4.求la的补集(lc为全集)
status bu(List la, List *lc) { //求补集
int i=0, j=0, flag=1;
int count = 0;
List listb;
init(&listb);//构建顺序表listb
for (i = 0; i < lc->Length; i++) {
for (j = 0; j < la.Length; j++) {
if (lc->data[i] == la.data[j]) { flag = 0; break;}
}
if (flag==1) {
count++;
insert(&listb,count,lc->data[i]);
}
flag=1;
}
listb.data[listb.Length]='\0';
printf("所求补集的元素为:%s\n", listb.data);
printf("所求补集长度为%d\n", listb.Length);
}
接下来是完整代码;
// 实验1用顺序表完成集合的交差并补操作
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define ListIncrease 20
#define ListInitsize 100
typedef char ElemType;
typedef void status;
typedef struct list {
ElemType *data; //存储空间基址
int Length; //当前长度
int size; //当前尺寸
} List;
void init(List *L){
L->Length=0;
L->size=ListInitsize;
L->data=(ElemType *)malloc(ListInitsize*sizeof(ElemType));
}
status create(List *la){ //用于创建顺序表
if(!la->data){
printf("分配失败");
exit(0);
}
List a;
init(&a);
scanf("%s",a.data);
printf("已成功输入数据\n");
int i = 0;
while (a.data[i] != '\0') {
if (a.data[i] >= 'a' &&a.data[i] <= 'z') {
char temp = a.data[i];
int flag = 1;
if (la->Length == 0) {
la->data[la->Length] = temp;
la->Length++;
}
else {
for (int z = 0; z < la->Length; z++) {
if (la->data[z] == temp) {
flag = 0;
break;
} //判断元素是否重复
}
if (flag == 1) {
la->data[la->Length] = temp;
la->Length++;
} //由于是集合所以要进行去重操作
}
}
i++;
}
}
status insert(List* lc,int i,char e){ //往表中插入元素
lc->data[i-1] = e;
++lc->Length;
}
status jiao(List la, List lb,List *lc) { //求交集
int i,j,count = 0;
for (i = 0; i < la.Length; i++) {
for (j = 0; j < lb.Length; j++) {
if (la.data[i] == lb.data[j]) {
count++;
insert(lc,count,la.data[i]);
}
}
}
lc->data[count]='\0';
}
status bing(List la, List lb,List *lc) { //求并集
int flag,i,j;
int count = lb.Length;
lc->Length = 0;
strcpy(lc->data, lb.data);
lc->Length = lb.Length;
for (i = 0; i < la.Length; i++) {
flag = 1;
for (j = 0; j < lb.Length; j++) {
if (la.data[i] == lb.data[j]) {
flag = 0;
}
}
if (flag == 1) {//flag==1表示该元素不是重复元素 ,是集合A特有的元素
count++;
insert(lc,count,la.data[i]);
}
}
lc->data[count]='\0';
}
status cha(List la, List *lc) { //求差集
int i=0, j=0, flag=1;
int count = 0;
List listc;
init(&listc);//构建顺序表listc
for (i = 0; i < la.Length; i++) {
for (j = 0; j < lc->Length; j++) {
if (la.data[i] == lc->data[j]) { flag = 0; break;}
}
if (flag==1) {//flag==1表示该元素不是重复元素,是la特有的元素
count++;
insert(&listc,count,la.data[i]);
}
flag=1;
}
listc.data[listc.Length]='\0';
printf("所求差集Lc为:");
puts(listc.data);
printf("所求差集Lc长度为: %d\n", listc.Length);
}
status bu(List la, List *lc) { //求补集
int i=0, j=0, flag=1;
int count = 0;
List listb;
init(&listb);//构建顺序表listb
for (i = 0; i < lc->Length; i++) {
for (j = 0; j < la.Length; j++) {
if (lc->data[i] == la.data[j]) { flag = 0; break;}
}
if (flag==1) {
count++;
insert(&listb,count,lc->data[i]);
}
flag=1;
}
listb.data[listb.Length]='\0';
printf("所求补集的元素为:%s\n", listb.data);
printf("所求补集长度为%d\n", listb.Length);
}
//主函数
int main() {
int t=7; //设置初始值
List La, Lb;
init(&La);
init(&Lb);
printf("请输入表La数据:\n");
create(&La);
printf("表La的数据为:%s\n", La.data);
printf("请输入表Lb数据:\n");
create(&Lb);
printf("表Lb的数据为:%s\n", Lb.data);
while(1) {
printf("————————*****欢迎,请选择*****—————\n");
printf("—————***1.求交集***—————\n");
printf("—————***2.求并集***—————\n");
printf("—————***3.求差集(A-B)***—————\n");
printf("—————***4.求差集(B-A)***—————\n");
printf("—————***5.求La补集***—————\n");
printf("—————***6.求Lb补集***—————\n");
printf("—————***7.退出***—————\n");
printf("请输入你的选择(1-7):\n");
scanf("%d", &t);
switch (t) {
case 1: {
List *Lc1 ;
Lc1=(List *) malloc(sizeof (List));
init(Lc1);
jiao(La,Lb,Lc1);
printf("交集Lc的元素为:%s\n", Lc1->data);
printf("Lc长度为%d\n", Lc1->Length);
break;
}
case 2: {
List *Lc2;
Lc2=(List *) malloc(sizeof (List));
init(Lc2);
bing(La, Lb,Lc2);
printf("并集Lc的元素为:%s\n", Lc2->data);
printf("Lc长度为%d\n", Lc2->Length);
break;
}
case 3: {
List *ld;
ld=(List *) malloc(sizeof (List));
init(ld);
jiao(La,Lb,ld);
cha(La,ld);
break;
}
case 4: {
List *lsd;
lsd=(List *) malloc(sizeof (List));
init(lsd);
jiao(La,Lb,lsd);
cha(Lb,lsd);
break;
}
case 5: {
List *Lc5 ;
Lc5=(List *) malloc(sizeof (List));
init(Lc5);
bing(La, Lb,Lc5);
bu(La,Lc5);
break;
}
case 6:{
List *Lc6 ;
Lc6=(List *) malloc(sizeof (List));
init(Lc6);
bing(La, Lb,Lc6);
bu(Lb,Lc6);
break;
}
case 7: {
printf("程序结束!谢谢您的使用!");
exit(0);
}
}
}
}
这是我写的第二篇优快云博客,如果有什么问题请各位及时指正,谢谢!