1.集合的交并补

分析: 

集合用线性表的单链表存储,结构体LNode中有元素信息域data,还有指向下一个结点的指针域next,共需要三个链表,其中La Lb 运算后的结果保存在Lc中。

 源代码:

 

View Code
  1 #include<iostream.h>
  2 #include<stdlib.h>
  3 //线性表的单链表存储结构
  4 typedef struct LNode{
  5     char data;
  6     struct LNode *next;
  7 }LNode,*LinkList;
  8 void CreateList_L(LinkList &L,int n)
  9 
 10     //逆位序输入n个元素的值,建立带表头结点的单链线性表L
 11     L=new LNode;
 12     L->next=NULL; //先建立一个带头结点的单链表
 13     for(int i=n;i>0;i--)
 14     {
 15         LNode *p=new LNode; //生成新结点
 16         cin>>p->data; //输入元素值
 17         p->next=L->next;//插入到表头
 18         L->next=p;
 19     }
 20 }
 21 void Bing(LinkList La,LinkList Lb,LinkList &Lc)//求并集
 22 //把 La 与 Lb 的并集放在链表Lc中
 23       Lc=new LNode;
 24     Lc->next=NULL;
 25     LNode *pa=La->next;
 26     while(pa)//把集合La中的元素复制到集合Lc中
 27     {
 28         LNode *q=new LNode;
 29         q->data=pa->data;
 30         q->next=Lc->next;
 31         Lc->next=q;
 32         pa=pa->next;//指向La的指针pa后移
 33     }
 34     LNode *pb=Lb->next;
 35     while(pb) //如果集合b中元素不同于集合a中元素,就添加到集合c中
 36     { 
 37        bool flag=true;//flag用来标记a,b中是否有相同元素
 38        pa=La->next;
 39        while(pa)
 40        {  
 41            if(pa->data==pb->data)
 42            {   flag=falsebreak; }
 43             else pa=pa->next;
 44        }
 45        if(flag) { //元素不同
 46            LNode *p=new LNode; 
 47            p->data=pb->data;
 48            p->next=Lc->next; 
 49            Lc->next=p;
 50        } 
 51        pb=pb->next;
 52     }
 53 }
 54 void Jiao(LinkList La,LinkList Lb,LinkList &Lc)//求交集
 55 {
 56     Lc=new LNode;
 57     Lc->next=NULL;
 58     LNode *pb=Lb->next;
 59     while(pb) //如果元素即属于集合a又属于集合b,则把该元素放到集合c中
 60     { 
 61        LNode *pa=La->next;
 62        while(pa)
 63        {  
 64            if(pa->data==pb->data) //有相同元素
 65            {   
 66              LNode *p=new LNode; 
 67              p->data=pb->data;
 68              p->next=Lc->next; 
 69              Lc->next=p; 
 70              break
 71            }
 72             else pa=pa->next;//没有继续后移
 73        }
 74        pb=pb->next;
 75     }
 76 }
 77 void Cha(LinkList La,LinkList Lb,LinkList &Lc) //求差集
 78 {
 79     Lc=new LNode;
 80     Lc->next=NULL;
 81     LNode *pa=La->next;
 82     while(pa)//如果元素属于集合a不属于集合b,则把该元素放到集合c中
 83     { 
 84         bool flag=true;
 85         LNode *pb=Lb->next;
 86         while(pb) 
 87         { 
 88             if(pb->data==pa->data)
 89             {   flag=falsebreak; }
 90             else pb=pb->next;
 91         }
 92         if(flag) { //元素不属于b
 93             LNode *p=new LNode; 
 94             p->data=pa->data;
 95             p->next=Lc->next; 
 96             Lc->next=p;
 97         } 
 98        pa=pa->next;
 99       }
100 }
101 void output(LinkList L) //输出元素
102 {
103     LNode *p=L->next;
104     while(p)
105     {
106         cout<<p->data<<" ";
107         p=p->next;
108     }
109     cout<<endl;
110 }
111 
112 int main()
113 {
114     LinkList L,La,Lb,Lc;
115     int i,n,a,b;
116     cout<<"请输入全集L的元素个数:"; cin>>n;
117     cout<<"请输入集合L中的元素:";    CreateList_L(L,n);
118     cout<<"请输入集合a的元素个数:";    cin>>a;
119     cout<<"请输入集合a中的元素:";    CreateList_L(La,a);
120     cout<<"请输入集合b的元素个数:";  cin>>b;
121     cout<<"请输入集合b中的元素:";  CreateList_L(Lb,b);
122     cout<<"*****************集合的并、交、差、补运算******************"<<endl;
123     cout<<"操作如下:1. a 并 b         2. a 交 b"<<endl;
124     cout<<"          3. a - b          4. b - a"<<endl;
125     cout<<"          5. a 的补         6. b 的补"<<endl;
126     cout<<"          7. 退出"<<endl;
127     while(1)
128     {
129        cout<<"请选择操作:";
130        cin>>i;
131        switch(i)
132        {
133        case 1: cout<<" a 并 b :"
134                Bing(La,Lb,Lc);   output(Lc);
135                break;
136        case 2: cout<<" a 交 b :";
137                Jiao(La,Lb,Lc);   output(Lc);
138                break;
139        case 3: cout<<" a - b :";
140                Cha(La,Lb,Lc);  output(Lc);
141                break;
142        case 4: cout<<" b - a :";
143                Cha(Lb,La,Lc);  output(Lc);
144                break;
145        case 5: cout<<" a的补 :"
146                Cha(L,La,Lc); output(Lc);
147                break;
148        case 6: cout<<" b的补 :"
149                Cha(L,Lb,Lc); output(Lc);
150                break;
151        case 7: exit(0);
152        }
153        cout<<endl;
154     }
155     return 0;
156 }

 

posted @ 2011-06-29 16:20  笑巧  阅读(2010)  评论(0编辑  收藏  举报