文章90
标签1
分类38

实现集合的各种运算#c

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX_SIZE 100
    typedef struct {
        int data[MAX_SIZE];
        int size;
    } Jihe;



    // 初始化集合
    void initjihe(Jihe *s) {
        s->size = 0;
    }


    int isinjihe(Jihe s, int x) {
        for (int i = 0; i < s.size; i++) {
            if (s.data[i] == x) {
                return 1;
            }
        }

        return 0;
    }

    void addtojihe(Jihe *s, int x) {

        if (!isinjihe(*s, x)) {
            s->data[s->size++] = x;
        }
        
    }

    //删移动覆盖
    void deletedata(Jihe *s, int x) {
        for (int i = 0; i < s->size; i++) {

        //0 1 2 3 
        //* * * * 

        if (s->data[i] == x) {
                for (int j = i; j < s->size - 1; j++) {
                    s->data[j] = s->data[j + 1];
                }


                s->size--;
                break;

            }


        }
    }

    //集合交集运算
    Jihe Jiaojiys(Jihe s1, Jihe s2) {
    //result 新集合

    Jihe result;
    initjihe(&result);
    for (int i = 0; i < s1.size; i++) {

    if (isinjihe(s2, s1.data[i])) {
    addtojihe(&result, s1.data[i]);
            }

    }
        return result;
    }
    //集合的并集运算
    Jihe bingjiys(Jihe s1, Jihe s2) {
        Jihe result;
        initjihe(&result);
        for (int i = 0; i < s1.size; i++) {
            addtojihe(&result, s1.data[i]);
        }
        for (int i = 0; i < s2.size; i++) {
            addtojihe(&result, s2.data[i]);
        }
        return result;
    }

    //集合的补集运算
    Jihe bujiys(Jihe s, Jihe U) {
        Jihe result;
        initjihe(&result);
        for (int i = 0; i < U.size; i++) {
            if (!isinjihe(s, U.data[i])) {
                addtojihe(&result, U.data[i]);
            }
        }
        return result;
    }
    //集合的差集运算
    Jihe chajiys(Jihe s1, Jihe s2) {
        Jihe result;
        initjihe(&result);
        for (int i = 0; i < s1.size; i++) {
            //s1 1 2 3 4
            //s2 4 5 6 7

            if (!isinjihe(s2, s1.data[i])) {
                addtojihe(&result, s1.data[i]);
            }
        }
        return result;
    }



    //对称差集运算

    //s1⊕s2={{s1US2}-{s1^s2}}
    //s1⊕s2={{s1-S2}U{s2-s1}}

    Jihe DCCys(Jihe s1, Jihe s2) {
        Jihe result;
        initjihe(&result);
        Jihe jiaoji = Jiaojiys(s1, s2);
        Jihe cha1 = chajiys(s1, jiaoji);
        Jihe cha2 = chajiys(s2, jiaoji);

        result = bingjiys(cha1, cha2);
        return result;
    }



    int main() {
    
    //own
        Jihe A, B;
        initjihe(&A);
        initjihe(&B);

        printf("集合A的元素个数:\n->");
        int n;
        scanf("%d", &n);

        printf("请输入集合A的元素:");
        for (int i = 0; i < n; i++) {
            int x;
            scanf("%d", &x);
            addtojihe(&A, x);
        }
        printf("请输入集合B的元素个数:\n->");
        scanf("%d", &n);
        printf("请输入集合B的元素:");
        for (int i = 0; i < n; i++) {
            int x;
            scanf("%d", &x);
            addtojihe(&B, x);
        }


    //全部结果


        printf("A ∩ B=");
        Jihe jiaoji = Jiaojiys(A, B);
        if(jiaoji.size==0){
            printf("Ø");
        }
        else{
    for (int i = 0; i < jiaoji.size; i++) {
        printf("%d ", jiaoji.data[i]);
        }

        }
    
        printf("\n");

        printf("A ∪ B=");
        Jihe bingji = bingjiys(A, B);
        for (int i = 0; i < bingji.size; i++) {
            printf("%d ", bingji.data[i]);
        }
        printf("\n");

        printf("A的补集=");
        Jihe buji = bujiys(A, B);
        if(buji.size==0){
            printf("Ø");
        }else{
    for (int i = 0; i < buji.size; i++) {
            printf("%d ", buji.data[i]);
        }
        }
        
        printf("\n");

        printf("A - B=");
        Jihe chaji = chajiys(A, B);
        if(chaji.size==0){
            printf("Ø");
        }else{
    for (int i = 0; i < chaji.size; i++) {
            printf("%d ", chaji.data[i]);
        }


        }
        
        printf("\n");
        printf("A ⊕ B=");
        Jihe dccdata = DCCys(A, B);
        if(dccdata.size==0){
            printf("Ø");
        }else{

        for (int i = 0; i < dccdata.size; i++) {
            printf("%d ", dccdata.data[i]);
        }

        }

        printf("\n");
        return 0;
    }

    //6.5
    //----------------------------集合的各种运算--------------------------

数据结构-综合排序答辩(C语言)

    # 头文件1-head.h


    #include<stdlib.h>
    #include <stdio.h>
    #include<time.h>
    #define NUM 2000//数组最大值
    struct timespec start,end;
    double resultTime;


    # 头文件2-paixufuction.h
    #include"head.h"

    //创建随机数存入num.txt文件----------------(1-10000)
    void getnum(int *array){
    int i,j;
    FILE *fp;
        srand(time(NULL));
        for(i=0;i<NUM;i++){
            array[i]=rand()%10000+1;        
        }
        //w->创建,读取
        if((fp=fopen("./num.txt","w")) == NULL ) {
            printf("Fail to open file!");
            exit(0);
        }else{

    for(i=0;i<NUM;i++)
            {
            fprintf(fp,"%d\n",array[i]);
            }


        }
            fclose(fp);
            printf("✔✔✔随机数写入nun.txt成功!!!\n\n");    //写文件
    

    }


    //交换数组值操作
    void changedata(int arr[],int i,int j){  
            int k;
            k=arr[j];
            arr[j]=arr[i];
            arr[i]=k;

    }

    //起泡排序
    void qipao(){
    int data[NUM];
    int i,j;
    int k;//替换变量


    FILE *F,*A;
        if((F=fopen("./num.txt","rt")) == NULL ) {
            printf("文件不存在,请先使用功能1-产随机数在num.txt\n");
            exit(0);
        }else{
            
            //将取出元素存入数组

    for(i=0;i<NUM;i++)
            {
            fscanf(F,"%d",&data[i]);
            }


            clock_gettime(CLOCK_MONOTONIC,&start);
                for(i=0;i<NUM-1;i++){
                    for(j=0;j<NUM-1-i;j++){                                                 
                    if(data[j]>data[j+1]){
                            changedata(data,j,j+1);
                                        }           
                                    }     

                                } 
                clock_gettime(CLOCK_MONOTONIC,&end);
                resultTime=(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/1e9; 

        //w->创建,读取
        if((A=fopen("./qipao.txt","w")) == NULL ) {
            printf("Fail to open file!");
            exit(0);
        }else{


    for(i=0;i<NUM;i++)
            {
            fprintf(A,"%d\n",data[i]);
            }


        }
            fclose(A);
            printf("\n✔✔✔起泡排序完成,结果已保存在qipao.txt文件\n本次排序花费:%f秒",resultTime);

        }

    }

    //选择排序
    void xuanze(){

    int data[NUM];
    FILE *F,*A;
    int i,j,mindata;  
    
        if((F=fopen("./num.txt","rt")) == NULL ) {
            printf("文件不存在,请先使用功能1-产随机数在num.txt\n");
            exit(0);
        }else{
            
            //将取出元素存入数组

    for(i=0;i<NUM;i++)
            {
            fscanf(F,"%d",&data[i]);
            }
        clock_gettime(CLOCK_MONOTONIC,&start);
        //选择排序代码部分
            
        for(i=0;i<NUM-1;i++){
            mindata = i;
            for(j=i+1;j<NUM;j++){
                if(data[j]<data[mindata])
                    mindata=j;
                                }
            if(mindata!=i){

                changedata(data,mindata,i);           

                        }
                                        
                                        
                            }
                clock_gettime(CLOCK_MONOTONIC,&end);
                resultTime=(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/1e9; 

        //w->创建,读取
        if((A=fopen("./xuanze.txt","w")) == NULL ) {
            printf("Fail to open file!");
            exit(0);
        }else{


    for(i=0;i<NUM;i++)
            {
            fprintf(A,"%d\n",data[i]);
            }


        }
            fclose(A);
            printf("\n✔✔✔选择排序完成,结果已保存在xuanze.txt文件\n本次排序花费:%f秒",resultTime);

        }

    }




    //堆排序

    //保证父节点大于每一个孩子节点
    void heapify(int *tree,int n,int i){
        if(i>=n){
            return;
        }
    int c1=2*i+1;
    int c2=2*i+2;
    int max=i;
    if(c1<n&&tree[c1]>tree[max]){
    max=c1;
    }

    if(c2<n&&tree[c2]>tree[max]){
    max=c2;
    }

    if(max!=i){
    changedata(tree,max,i);
    heapify(tree,n,max);
    }

    }
    //从最后父节点开始调整为大顶堆
    void buidheap(int *tree,int n){
    int lastnode=n-1;
    int parent=(lastnode-1)/2;
    int i;
    for(i=parent;i>=0;i--){
    heapify(tree,n,i);
    }
    }
    //堆排序操作
    void heapmain(int *tree,int n){
    buidheap(tree,n);
    int i;
    for(i=n-1;i>=0;i--){
        changedata(tree,i,0);
        //将父节点和最后节点交换后再次调整
        
        heapify(tree,i,0);
    }
    }

    void heap(){
    int data[NUM];
    int size;//堆大小
    size=NUM;
    int i,j,mindata;  
    FILE *F,*A;
        if((F=fopen("./num.txt","rt")) == NULL ) {
            printf("文件不存在,请先使用功能1-产随机数在num.txt\n");
            exit(0);
        }else{         
            //将取出元素存入数组
    for(i=0;i<NUM;i++)
            {
            fscanf(F,"%d",&data[i]);
            }          

        //获取开机到现在的时间
        clock_gettime(CLOCK_MONOTONIC,&start); 

        heapmain(data, NUM);

        //获取完成程序的时间
        clock_gettime(CLOCK_MONOTONIC,&end);
        resultTime=(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/1e9; 
        printf("\n✔✔✔堆排序完成,结果已保存在heap.txt文件\n本次排序花费:%f秒", resultTime);         
        //w->创建,读取
        if((A=fopen("./heap.txt","w")) == NULL ) { 
            printf("Fail to open file!");
            exit(0);
        }else{

    for(i=0;i<NUM;i++)
            {
            fprintf(A,"%d\n",data[i]);
            }

        }

            fclose(A);

        }
    }



    #主函数-main.c



    #include"paixufuction.h"
    int main()
    {

    printf("✿ ✿ ✿数据结构课程设计-综合排序✿ ✿ ✿\n");
    int choice;
    int array[NUM];
    while(1){

    printf("▓▓▓▓▓▓▓▓---功能大全如下,请选择---▓▓▓▓▓▓▓▓\n");
    printf("输入数字1:生成随机数在文件num.txt中\n");
    printf("输入数字2:起泡排序\n");
    printf("输入数字3:选择排序\n");
    printf("输入数字4:堆排序\n");
    printf("输入数字5:退出本程序\n");
    scanf("%d",&choice);
    switch(choice){
    case 1:
    getnum(array);
    break;
    case 2:
    qipao();
    break;
    case 3:
    xuanze();
    break;
    case 4:
    heap();
    break;
    case 5:
    printf("退出程序\n");
    return 0;
    default:
    printf("!!!输入错误,请重新输入数字运行\n");

    }

    }



        }

这个时代面子已经不值钱了

IMG20230525225850.jpg

​ “有些事情注定等不到,去勇敢的追逐吧”​

​ “有些事情注定等不到,去勇敢的追逐吧”​

1683640573962.jpg

路漫漫其修远兮.

拒绝摆烂.

~X•Y 
     -5.7

1681400064152.gif

">