qq_52303586 2021-07-03 15:18 采纳率: 100%
浏览 133
已结题

字符串集合的集合运算 C语言

集合的交、并、差运算 
【问题描述】
编制一个能演示执行集合的交、并和差运算的程序。
【任务要求】
1)集合元素用字符串
2)算法要点:利用单链表表示集合;理解好三种运算的含义
【测试数据】
自行设定,注意边界等特殊情况。

  • 写回答

1条回答 默认 最新

  • CSDN专家-sinJack 2021-07-03 15:36
    关注

    如有帮助,请采纳。点击我回答右上角【采纳】按钮。
    参考如下:

    #include "F:/SqList.cpp"  
    #include<iostream.h>  
    #include<string.h>  
    void UnionList(SqList *LA,SqList *LB,SqList *&LC)//并集  
    {  
        int i=0,j=0,k=0;    //i、j、k分别作为LA、LB、LC的下标  
        LC=(SqList *)malloc(sizeof(SqList));  
        LC->length=0;  
        while (i<LA->length && j<LB->length)  
        {     
            if (LA->data[i]<LB->data[j])  
            {     
                LC->data[k]=LA->data[i];  
                i++;k++;  
            }          
            else  if(LA->data[i]==LB->data[j])  
            {  
                LC->data[k]=LA->data[i];  
                i++;k++;j++;  
            }  
            else if(LA->data[i]>LB->data[j])  
            {  
                LC->data[k]=LB->data[j];  
                k++;j++;  
            }  
        }  
        while (i<LA->length)    //LA尚未扫描完,将其余元素插入LC中  
        {     
            LC->data[k]=LA->data[i];  
            i++;k++;  
        }  
        while (j<LB->length)  //LB尚未扫描完,将其余元素插入LC中  
        {     
            LC->data[k]=LB->data[j];  
            j++;k++;  
        }   
        LC->length=k;  
    }  
    void Commnode(SqList *LA,SqList *LB,SqList *&LC)//交集  
    {  
         int i=0,j=0,k=0;  
         LC=(SqList *)malloc(sizeof(SqList));  
         LC->length=0;  
         while(i<LA->length&&j<LB->length)    
        {  
             if(LA->data[i]<LB->data[j])      
            {  
                i++;      
            }  
            else if(LA->data[i]==LB->data[j])  
            {  
                LC->data[k]=LA->data[i];  
                   i++;j++;k++;           
            }  
            else if(LA->data[i]>LB->data[j])  
            {  
                j++;      
            }  
        }  
        LC->length=k;  
    }  
    void Subtraction(SqList *LA,SqList *LB,SqList *&LC)//差集  
    {  
         int i=0,j=0,k=0;  
         LC=(SqList *)malloc(sizeof(SqList));  
         LC->length=0;  
         while(i<LA->length&&j<LB->length)    
        {  
             if(LA->data[i]<LB->data[j])      
            {  
                LC->data[k]=LA->data[i];  
                i++;k++;      
            }   
            else if(LA->data[i]==LB->data[j])  
            {  
                i++;j++;  
            }  
            else if(LA->data[i]>LB->data[j])  
            {  
                j++;  
            }  
        }  
        while(i<LA->length)  
        {  
             LC->data[k]=LA->data[i];  
              i++;k++;        
        }      
        LC->length=k;  
    }  
    void main()  
    {   char a[10],b[10];  
        SqList *L1,*L2,*L3;  
        int a1,b1;  
            InitList(L1);  
            InitList(L2);  
            InitList(L3);  
            int A=0;  
        do{   
           cout<<"请输入集合A:";  
           cin>>a;  
           a1=strlen(a);  
           for(int i=0;i<a1;i++)  
              ListInsert(L1,a[i]);  
           if(a1>ListLength(L1))  
           {  
             cout<<"注意 ! 元素有重复"<<endl;  
             DestroyList(L1);InitList(L1);  
           }  
           else if(a1==ListLength(L1))A=1;  
          }while(A==0);   
            int B=0;  
      
             do{      
            cout<<"请输入集合B:";  
            cin>>b;  
            b1=strlen(b);  
            for(int j=0;j<b1;j++)  
              ListInsert(L2,b[j]);  
            if(b1>ListLength(L2))  
            {  
              cout<<"注意 ! 元素有重复"<<endl;  
              DestroyList(L2);InitList(L2);  
            }  
            else if(b1==ListLength(L2)) B=1;  
           }while(B==0);  
      
          cout<<"集合A的长度:"<<a1<<endl;  
          cout<<"集合B的长度:"<<b1<<endl;  
           
      
          cout<<"集合A在顺序表中的结构:"<<endl;  
          DispList(L1);  
          cout<<"集合B在顺序表中的结构:"<<endl;  
          DispList(L2);   
      
          cout<<"并集:"<<endl;  
          UnionList(L1,L2,L3);  
          DispList(L3);  
          cout<<"交集:"<<endl;  
          Commnode(L1,L2,L3);  
          DispList(L3);  
          cout<<"差集:"<<endl;  
          Subtraction(L1,L2,L3);  
          DispList(L3);   
    }  
    //SqList.cpp文件  
    #include <stdio.h>  
    #include <malloc.h>  
    #define MaxSize 50  
    typedef char ElemType;   
    typedef struct   
    {   ElemType data[MaxSize];     //存放顺序表元素  
        int length;         //存放顺序表的长度  
    } SqList;                               //顺序表的类型定义  
      
                              
    void CreateList(SqList *&L,ElemType a[],int n)  //建立顺序表  
    {  
        int i;  
        L=(SqList *)malloc(sizeof(SqList));  
        for (i=0;i<n;i++)  
            L->data[i]=a[i];  
        L->length=n;  
    }  
      
      
    void InitList(SqList *&L)                       //初始化线性表  
    {  
        L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间  
        L->length=0;  
    }  
    void DestroyList(SqList *&L)                    //销毁线性表  
    {  
        free(L);  
    }  
    int ListEmpty(SqList *L)                        //判线性表是否为空表  
    {  
        return(L->length==0);  
    }  
    int ListLength(SqList *L)                       //求线性表的长度  
    {  
        return(L->length);  
    }  
    void DispList(SqList *L)                        //输出线性表  
    {  
        int i;  
        if (ListEmpty(L)) return;  
        for (i=0;i<L->length;i++)  
            printf("%c ",L->data[i]);  
        printf("/n");  
    }  
    int GetElem(SqList *L,int i,ElemType &e)        //求线性表中某个数据元素的值  
    {  
        if (i<1 || i>L->length)  
            return 0;  
        e=L->data[i-1];  
        return 1;  
    }  
    int LocateElem(SqList *L, ElemType e)           //按元素值查找  
    {  
        int i=0;  
        while (i<L->length && L->data[i]!=e) i++;  
        if (i>=L->length)  
            return 0;  
        else  
            return i+1;  
    }  
    int ListInsert(SqList *&L,int i,ElemType e)     //插入数据元素  
    {  
        int j;  
        if (i<1 || i>L->length+1)  
            return 0;  
        i--;                    //将顺序表位序转化为elem下标  
        for (j=L->length;j>i;j--)           //将data[i]及后面元素后移一个位置  
            L->data[j]=L->data[j-1];  
        L->data[i]=e;  
        L->length++;                //顺序表长度增1  
        return 1;  
    }  
    int ListInsert(SqList *&L,ElemType e)           //有序表  
    {  
       int i=0,j;  
       while(i<L->length&&L->data[i]<e)i++;  
       if(L->data[i]==e)return 0;  
       for(j=ListLength(L);j>i;j--)  
           L->data[j]=L->data[j-1];  
       L->data[i]=e;  
       L->length++;  
       return 1;  
    }  
    int ListDelete(SqList *&L,int i,ElemType &e)    //删除数据元素  
    {  
        int j;  
        if (i<1 || i>L->length)  
            return 0;  
        i--;                    //将顺序表位序转化为elem下标  
        e=L->data[i];  
        for (j=i;j<L->length-1;j++)         //将data[i]之后的元素前移一个位置  
            L->data[j]=L->data[j+1];  
        L->length--;                //顺序表长度减1  
        return 1;  
    }  
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 已采纳回答 10月12日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分