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=false; break; }
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=false; break; }
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 }
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=false; break; }
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=false; break; }
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 }