实验1用顺序表完成集合的交差并补操作

题目:以顺序表表示集合,编制一个能演示执行集合的并、交、差、补运算的程序。

(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);
            }
        }
    }
}

这是我写的第二篇CSDN博客,如果有什么问题请各位及时指正,谢谢!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值