数据结构课程设计
题目:顺序表的应用—集合运算
班级:计算机 2002 班
姓名
一、问题描述。
运用数据结构顺序表来存储集合,结构体中应包
含集合的大小、存放集合的数组。通过以数组存储的
元素导入到顺序表中存储,形成一个含有元素的集合,
并通过一些功能函数和操作函数来实现集合之间的交
集、并集、补集和差集运算。
二、设计要求。
基础设计
需要使用顺序表结构构件集合
通过数组元素建立集合
实现集合的交集、并集。
扩展设计
界面的设计
实现集合的补集、差集。
所有操作集合的总输出。
三、数据结构。
1. 数据结构:顺序表、数组。
2. 存储结构:顺序存储。
四、分析与实现。
初始化顺序表
typedef struct { //初始化顺序表
dataType data[MaxSize];
int size;
}SqSet;
创建一个空的顺序表(集合)
SqSet* CreateSet() //创建一个空的集合
{
SqSet *t = (SqSet*)malloc(sizeof(SqSet));
t->size = 0;
return t;
}
从数组元素建立集合
SqSet* CreateSetFromArray(dataType a[],int n){ //从数组元素建立集合
int i=0;
SqSet *t=(SqSet*)malloc(sizeof(SqSet));
t->size=n;
for( i=0; i<n; i++) //利用 for 循环从数组里面向顺序表(集合)里面添加元素
t->data[i] = a[i];
return t;
}
功能函数
1. //查找集合中是否存在元素 x
int Find(SqSet *s,dataType x)
{
int i;
for (i=0; i<s->size; i++)
if (s->data[i]==x)
return 1;
return 0;}
2. //往集合中增加元素 X
void Add(SqSet *s,dataType x){
if(Find(s,x)) return;
s->data[s->size]=x;
s->size++;}
3. //删除集合中的元素 X
void Delete(SqSet *s,dataType x){
int i;
for(i=0;i<s->size;i++){
if(s->data[i]==x){
s->data[i]=s->data[--s->size];
return;
}
}
}
4. //输出集合
void Print(SqSet *s){
int i;
if(s->size==0)
printf("该集合为空");
else
for(i=0;i<s->size;i++)
printf("%c ",s->data[i]);
printf("\n");}
//求两个集合的并集
void Union(SqSet *a, SqSet *b, SqSet *c)
{
int i;
for (i=0;i<a->size;i++) //通过 for 循环把集合 a 的所有元素传递给
c->data[i]=a->data[i]; 集合 c
c->size=a->size;
for(i=0;i<b->size;i++)
if(!Find(c,b->data[i])) //通过以集合 c 的元素为底,以 b 集合的元素
c->data[c->size++]=b->data[i]; 为查找元素,一个一个的进行利用 find
} 函数进行判断,如果在 c 里面没有找到
该元素,则将该元素放入集合 c 中。
//求两个集合的交集
void Intersection(SqSet *a,SqSet *b,SqSet *c)
{ int i;
c->size=0;
for(i=0;i<a->size;i++) //通过以集合 b 的元素为底,以 a 集合的元素
if(Find(b,a->data[i])) 为查找元素,一个一个的进行利用 find
c->data[c->size++]=a->data[i]; 函数进行判断,如果在 b 里面找到了
} 该元素,则将该元素放入集合 c 中。
//求集合的补集
void buji(SqSet *a,SqSet *b,SqSet *c)
{ int i;
c->size=0; //通过以集合 b 的元素为底,以 a(全集 u)
for(i=0;i<a->size;i++){ 的元素为查找元素,一个一个的进行利用 find
if(!Find(b,a->data[i])) 函数进行判断,如果在 b 里面没有
c->data[c->size++]=a->data[i]; 该元素,则将该元素放入集合 c 中。
}
}
//求集合的差集
void chaji(SqSet *a,SqSet *b,SqSet *c)
{ int i;
c->size=0; //通过以集合 b 的元素为底,以 a 集合的元素
for(i=0;i<a->size;i++){为查找元素,一个一个的进行利用 find
if(!Find(b,a->data[i])){ 函数进行判断,如果 b 中没有该元素
c->data[c->size++]=a->data[i]; 则将该元素放入 c 集合中。
}
}
}
界面构建
/********************************************界面**************************************/
void show(){
printf("\t|-------------------------集合运算--------------------------|\n");
printf("\n");
printf("\t|------1.向集合里增加元素--------||------7.集合的差-----------|\n");
printf("\t|------2.查找集合里是否存在元素--||------8.输出结果-----------|\n");
printf("\t|------3.删除集合里的元素--------||------9.退出------------ --|\n");
printf("\t|------4.集合的交----------------||---------------------------|\n");
printf("\t|------5.集合的并----------------||---------------------------|\n");
printf("\t|------6.集合的补----------------||---------------------------|\n");
printf("\n");
printf("\t|-----------------------------------------------------------|\n");
printf("\n");
}
主函数和用户交互命令
1. 初始定义
int main(){
int choice; //定义初始数组 A,B 和 U。
dataType A[]={'a','b','c','d'};
dataType B[]={'a','d','e','f','w','r'};
dataType
U[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
SqSet *s1, *s2, *s3, *s4, *s5, *s6, *s61, *s7, *s71, *s8;
s1=CreateSetFromArray(A,4); //以数组 A、B 和 U 的数据建立