第1关:集合创建
本关任务:自选数据结构,创建一个空集合。
第2关: 插入元素到集合中
本关任务:
完成函数insert(int data, Set A)
若data本来是A的成员,则A不变,否则将data插入集合,为方便,将data插入集合的最后一个元素之后。
第3关:判断某元素是否属于集合
本关任务:
完成函数member(int data,Set A) ,判断data是否在集合A中,若data在集合中,则返回值1,否则返回值0
第4关:从集合中删除指定元素
本关任务:
完成函数 delete(int data, Set A),从集合A中删除值与data相同的元素。
第5关:求集合的并集
本关任务:
完成函数Union(Set A,Set B,Set C),实现求集合A,B的并集,结果放入集合C。
算法提示:
先将集合A的元素放入集合C,再将在B中且不在A中的元素放入集合C,可使用关卡2-4实现的函数。
第6关:求集合的交集
本关任务:
完成函数intersect(Set A,Set B,Set C),求集合A,B的交集,结果放入集合C。
本关任务:
完成函数difference(Set A,Set B,Set C),求A-B的值,放入集合C中
#include <stdio.h>
#include <stdlib.h>
struct SetNode
{
int info;
int data[1000];
};
typedef struct SetNode *Set;
void printSet(Set A)
{
for(int i = 0;i<A->info;i++) printf("%d ",A->data[i]);
printf("\n");
}
Set createEmptySet()
{
Set set = (Set)malloc(sizeof(struct SetNode));
for(int i=0;i<1000;i++) set->data[i] = 0;
set->info=0;
return set;
}
void insert(int data, Set A)
{
if (A->info==0) {
A->data[0] = data;
A->info++;
return;
}
for(int i = 0;i<A->info;i++) if(A->data[i]==data) return;
for(int i = 0;i<A->info;i++)
if(A->data[i]>data){
for (int j = A->info; j>=i ; j-- ) A->data[j+1] = A->data[j];
A->data[i] = data;
A->info++;
return;
}
A->data[A->info] = data;
A->info++;
}
int member(int data,Set A)
{
for(int i = 0;i<A->info;i++) if(A->data[i]==data) return 1;
return 0;
}
// 头歌里函数名要改成 delete
Set delete1(int data, Set A)
{
for(int i = 0;i<A->info;i++)
if(A->data[i]==data){
for(int j = i;j < A->info; j++) A->data[j] = A->data[j+1];
A->info--;
return A;
}
return A;
}
void Union(Set A, Set B, Set C)
{
int Alenth = A->info,Blength = B->info;
int i = 0,j = 0,k=0;
while(i<Alenth&&j<Blength){
if(A->data[i]>B->data[j]){
C->data[k++] = B->data[j++];
C->info++;
}else if(A->data[i]<B->data[j]){
C->data[k++] = A->data[i++];
C->info++;
}else{
C->data[k++] = A->data[i++];
j++;
C->info++;
}
}
while(i<Alenth){
C->data[k++] = A->data[i++];
C->info++;
}
while (j<Blength) {
C->data[k++] = B->data[j++];
C->info++;
}
}
void intersect(Set A, Set B, Set C)
{
int Alenth = A->info,Blength = B->info;
int i = 0,j = 0,k=0;
while(i<Alenth&&j<Blength){
if(A->data[i]>B->data[j]){
j++;
}else if(A->data[i]<B->data[j]){
i++;
}else{
C->data[k++] = A->data[i++];
C->info++;
j++;
}
}
}
void difference(Set A, Set B, Set C)
{
int Alenth = A->info,Blength = B->info;
int i = 0,j = 0,k=0;
while(i<Alenth&&j<Blength){
if(A->data[i]==B->data[j]){
i++;
j++;
}else if(A->data[i]<B->data[j]){
C->data[k++] = A->data[i++];
C->info++;
}else{
j++;
}
}
while(i<Alenth){
C->data[k++] = A->data[i++];
C->info++;
}
}