编制一个能演示执行集合的并、交和差运算的程序。(有序表)

 

编制一个能演示执行集合的并、交和差运算的程序。  

Code:
  1. #include "F:/SqList.cpp"  
  2. #include<iostream.h>  
  3. #include<string.h>  
  4. void UnionList(SqList *LA,SqList *LB,SqList *&LC)//并集  
  5. {  
  6.     int i=0,j=0,k=0;    //i、j、k分别作为LA、LB、LC的下标  
  7.     LC=(SqList *)malloc(sizeof(SqList));  
  8.     LC->length=0;  
  9.     while (i<LA->length && j<LB->length)  
  10.     {     
  11.         if (LA->data[i]<LB->data[j])  
  12.         {     
  13.             LC->data[k]=LA->data[i];  
  14.             i++;k++;  
  15.         }          
  16.         else  if(LA->data[i]==LB->data[j])  
  17.         {  
  18.             LC->data[k]=LA->data[i];  
  19.             i++;k++;j++;  
  20.         }  
  21.         else if(LA->data[i]>LB->data[j])  
  22.         {  
  23.             LC->data[k]=LB->data[j];  
  24.             k++;j++;  
  25.         }  
  26.     }  
  27.     while (i<LA->length)    //LA尚未扫描完,将其余元素插入LC中  
  28.     {     
  29.         LC->data[k]=LA->data[i];  
  30.         i++;k++;  
  31.     }  
  32.     while (j<LB->length)  //LB尚未扫描完,将其余元素插入LC中  
  33.     {     
  34.         LC->data[k]=LB->data[j];  
  35.         j++;k++;  
  36.     }   
  37.     LC->length=k;  
  38. }  
  39. void Commnode(SqList *LA,SqList *LB,SqList *&LC)//交集  
  40. {  
  41.      int i=0,j=0,k=0;  
  42.      LC=(SqList *)malloc(sizeof(SqList));  
  43.      LC->length=0;  
  44.      while(i<LA->length&&j<LB->length)    
  45.     {  
  46.          if(LA->data[i]<LB->data[j])      
  47.         {  
  48.             i++;      
  49.         }  
  50.         else if(LA->data[i]==LB->data[j])  
  51.         {  
  52.             LC->data[k]=LA->data[i];  
  53.                i++;j++;k++;           
  54.         }  
  55.         else if(LA->data[i]>LB->data[j])  
  56.         {  
  57.             j++;      
  58.         }  
  59.     }  
  60.     LC->length=k;  
  61. }  
  62. void Subtraction(SqList *LA,SqList *LB,SqList *&LC)//差集  
  63. {  
  64.      int i=0,j=0,k=0;  
  65.      LC=(SqList *)malloc(sizeof(SqList));  
  66.      LC->length=0;  
  67.      while(i<LA->length&&j<LB->length)    
  68.     {  
  69.          if(LA->data[i]<LB->data[j])      
  70.         {  
  71.             LC->data[k]=LA->data[i];  
  72.             i++;k++;      
  73.         }   
  74.         else if(LA->data[i]==LB->data[j])  
  75.         {  
  76.             i++;j++;  
  77.         }  
  78.         else if(LA->data[i]>LB->data[j])  
  79.         {  
  80.             j++;  
  81.         }  
  82.     }  
  83.     while(i<LA->length)  
  84.     {  
  85.          LC->data[k]=LA->data[i];  
  86.           i++;k++;        
  87.     }      
  88.     LC->length=k;  
  89. }  
  90. void main()  
  91. {   char a[10],b[10];  
  92.     SqList *L1,*L2,*L3;  
  93.     int a1,b1;  
  94.         InitList(L1);  
  95.         InitList(L2);  
  96.         InitList(L3);  
  97.         int A=0;  
  98.     do{   
  99.        cout<<"请输入集合A:";  
  100.        cin>>a;  
  101.        a1=strlen(a);  
  102.        for(int i=0;i<a1;i++)  
  103.           ListInsert(L1,a[i]);  
  104.        if(a1>ListLength(L1))  
  105.        {  
  106.          cout<<"注意 ! 元素有重复"<<endl;  
  107.          DestroyList(L1);InitList(L1);  
  108.        }  
  109.        else if(a1==ListLength(L1))A=1;  
  110.       }while(A==0);   
  111.         int B=0;  
  112.   
  113.          do{      
  114.         cout<<"请输入集合B:";  
  115.         cin>>b;  
  116.         b1=strlen(b);  
  117.         for(int j=0;j<b1;j++)  
  118.           ListInsert(L2,b[j]);  
  119.         if(b1>ListLength(L2))  
  120.         {  
  121.           cout<<"注意 ! 元素有重复"<<endl;  
  122.           DestroyList(L2);InitList(L2);  
  123.         }  
  124.         else if(b1==ListLength(L2)) B=1;  
  125.        }while(B==0);  
  126.   
  127.       cout<<"集合A的长度:"<<a1<<endl;  
  128.       cout<<"集合B的长度:"<<b1<<endl;  
  129.        
  130.   
  131.       cout<<"集合A在顺序表中的结构:"<<endl;  
  132.       DispList(L1);  
  133.       cout<<"集合B在顺序表中的结构:"<<endl;  
  134.       DispList(L2);   
  135.   
  136.       cout<<"并集:"<<endl;  
  137.       UnionList(L1,L2,L3);  
  138.       DispList(L3);  
  139.       cout<<"交集:"<<endl;  
  140.       Commnode(L1,L2,L3);  
  141.       DispList(L3);  
  142.       cout<<"差集:"<<endl;  
  143.       Subtraction(L1,L2,L3);  
  144.       DispList(L3);   
  145. }  
  146. //SqList.cpp文件  
  147. #include <stdio.h>  
  148. #include <malloc.h>  
  149. #define MaxSize 50  
  150. typedef char ElemType;   
  151. typedef struct   
  152. {   ElemType data[MaxSize];     //存放顺序表元素  
  153.     int length;         //存放顺序表的长度  
  154. } SqList;                               //顺序表的类型定义  
  155.   
  156.                           
  157. void CreateList(SqList *&L,ElemType a[],int n)  //建立顺序表  
  158. {  
  159.     int i;  
  160.     L=(SqList *)malloc(sizeof(SqList));  
  161.     for (i=0;i<n;i++)  
  162.         L->data[i]=a[i];  
  163.     L->length=n;  
  164. }  
  165.   
  166.   
  167. void InitList(SqList *&L)                       //初始化线性表  
  168. {  
  169.     L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间  
  170.     L->length=0;  
  171. }  
  172. void DestroyList(SqList *&L)                    //销毁线性表  
  173. {  
  174.     free(L);  
  175. }  
  176. int ListEmpty(SqList *L)                        //判线性表是否为空表  
  177. {  
  178.     return(L->length==0);  
  179. }  
  180. int ListLength(SqList *L)                       //求线性表的长度  
  181. {  
  182.     return(L->length);  
  183. }  
  184. void DispList(SqList *L)                        //输出线性表  
  185. {  
  186.     int i;  
  187.     if (ListEmpty(L)) return;  
  188.     for (i=0;i<L->length;i++)  
  189.         printf("%c ",L->data[i]);  
  190.     printf("/n");  
  191. }  
  192. int GetElem(SqList *L,int i,ElemType &e)        //求线性表中某个数据元素的值  
  193. {  
  194.     if (i<1 || i>L->length)  
  195.         return 0;  
  196.     e=L->data[i-1];  
  197.     return 1;  
  198. }  
  199. int LocateElem(SqList *L, ElemType e)           //按元素值查找  
  200. {  
  201.     int i=0;  
  202.     while (i<L->length && L->data[i]!=e) i++;  
  203.     if (i>=L->length)  
  204.         return 0;  
  205.     else  
  206.         return i+1;  
  207. }  
  208. int ListInsert(SqList *&L,int i,ElemType e)     //插入数据元素  
  209. {  
  210.     int j;  
  211.     if (i<1 || i>L->length+1)  
  212.         return 0;  
  213.     i--;                    //将顺序表位序转化为elem下标  
  214.     for (j=L->length;j>i;j--)           //将data[i]及后面元素后移一个位置  
  215.         L->data[j]=L->data[j-1];  
  216.     L->data[i]=e;  
  217.     L->length++;                //顺序表长度增1  
  218.     return 1;  
  219. }  
  220. int ListInsert(SqList *&L,ElemType e)           //有序表  
  221. {  
  222.    int i=0,j;  
  223.    while(i<L->length&&L->data[i]<e)i++;  
  224.    if(L->data[i]==e)return 0;  
  225.    for(j=ListLength(L);j>i;j--)  
  226.        L->data[j]=L->data[j-1];  
  227.    L->data[i]=e;  
  228.    L->length++;  
  229.    return 1;  
  230. }  
  231. int ListDelete(SqList *&L,int i,ElemType &e)    //删除数据元素  
  232. {  
  233.     int j;  
  234.     if (i<1 || i>L->length)  
  235.         return 0;  
  236.     i--;                    //将顺序表位序转化为elem下标  
  237.     e=L->data[i];  
  238.     for (j=i;j<L->length-1;j++)         //将data[i]之后的元素前移一个位置  
  239.         L->data[j]=L->data[j+1];  
  240.     L->length--;                //顺序表长度减1  
  241.     return 1;  
  242. }  
  243.   
  244.    

 

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是一个简单的 C 语言程序,可以实现集合的并、交和差运算程序中使用了数组来存储集合元素,元素的类型为字符,限定为小写字母。 ``` #include <stdio.h> #define SET_SIZE 26 void init_set(char set[]); void print_set(char set[]); void union_set(char set1[], char set2[], char result[]); void intersect_set(char set1[], char set2[], char result[]); void diff_set(char set1[], char set2[], char result[]); int main() { char set1[SET_SIZE] = {0}; char set2[SET_SIZE] = {0}; char result[SET_SIZE] = {0}; init_set(set1); init_set(set2); set1[0] = 'a'; set1[1] = 'b'; set1[2] = 'c'; set2[1] = 'c'; set2[2] = 'd'; set2[3] = 'e'; printf("Set 1: "); print_set(set1); printf("Set 2: "); print_set(set2); union_set(set1, set2, result); printf("Union set: "); print_set(result); intersect_set(set1, set2, result); printf("Intersect set: "); print_set(result); diff_set(set1, set2, result); printf("Difference set (set1 - set2): "); print_set(result); return 0; } void init_set(char set[]) { for (int i = 0; i < SET_SIZE; i++) { set[i] = 0; } } void print_set(char set[]) { printf("{ "); for (int i = 0; i < SET_SIZE; i++) { if (set[i] != 0) { printf("%c ", set[i]); } } printf("}\n"); } void union_set(char set1[], char set2[], char result[]) { for (int i = 0; i < SET_SIZE; i++) { if (set1[i] != 0) { result[i] = set1[i]; } else if (set2[i] != 0) { result[i] = set2[i]; } else { result[i] = 0; } } } void intersect_set(char set1[], char set2[], char result[]) { for (int i = 0; i < SET_SIZE; i++) { if (set1[i] != 0 && set2[i] != 0) { result[i] = set1[i]; } else { result[i] = 0; } } } void diff_set(char set1[], char set2[], char result[]) { for (int i = 0; i < SET_SIZE; i++) { if (set1[i] != 0 && set2[i] == 0) { result[i] = set1[i]; } else { result[i] = 0; } } } ``` 程序的运行结果如下: ``` Set 1: { a b c } Set 2: { c d e } Union set: { a b c d e } Intersect set: { c } Difference set (set1 - set2): { a b } ``` 在上面的程序中,我们定义了 `SET_SIZE` 常量,用于指定集合的大小,即集合元素的个数。在 `init_set` 函数中,我们将集合元素全部初始化为 0。在 `print_set` 函数中,我们输出集合中所有非零元素。在 `union_set` 函数中,我们遍历集合元素,将所有非零元素添加到结果集合中。在 `intersect_set` 函数中,我们遍历集合元素,将同时存在于两个集合中的元素添加到结果集合中。在 `diff_set` 函数中,我们遍历集合元素,将只存在于第一个集合中的元素添加到结果集合中。 当然,上面的程序只是一个简单的示例,如果需要更复杂的集合运算,还需要进一步优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值