实验内容: (1)创建一个空的集合; (2)从数组元素建立集合; (3)查找集合中是否存在元素x; (4)往集合中增加元素x; (未做) (5)删除集合的元素x; (未做) (6)求两个集合的并集; (7)求两个集合的交集; (8)输出集合。 |
get到的知识点: 1.对于下面这种定义顺序表的方式,若主函数中直接定义了一个SET set; 则不再需要malloc动态分配存储空间,切记! typedef struct SQ_LIST{ 2.如何将一个字符数组作为参数传到子函数中
3.语句简化
|
算法设计: 用线性表来存储集合,结构体中包含集合的大小、存放集合的数组。 |
#include<stdio.h>
typedef unsigned int boolean;
#define TRUE 1
#define FALSE 0
typedef char DATA_TYPE;
#define MAXSIZE 100
typedef struct SQ_LIST{
DATA_TYPE data[MAXSIZE];
int count;
}SET;
void initSet(SET *head);
void initSetFromArray(SET *set, DATA_TYPE ar[], int count);
void showSet(SET set);
boolean findSetElement(SET set, DATA_TYPE x);
void unionSet(SET set1, SET set2, SET *head);
void intersectionSet(SET set1, SET set2, SET *head);
//求两个集合的交集
void intersectionSet(SET set1, SET set2, SET *head){
int i;
for(i = 0; i < set1.count; i++){
if(findSetElement(set2, set1.data[i])){
head->data[(head->count)++] = set1.data[i];
}
}
}
//求两个集合的并集
void unionSet(SET set1, SET set2, SET *head){
int i;
for(i = 0; i < set1.count; i++){
head->data[i] = set1.data[i];
}
head->count = set1.count;
for(i = 0; i < set2.count; i++){
if(!findSetElement(*head, set2.data[i])){
head->data[head->count] = set2.data[i];
head->count++;
//上面两句话等价于 head->data[head->count++] = set2.data[i];
//先用原值进行计算,然后+1
}
}
}
//查找集合中是否存在元素x
boolean findSetElement(SET set, DATA_TYPE x){
int i;
for(i = 0; i < set.count; i++){
if(set.data[i] == x){
return TRUE;
}
}
return FALSE;
}
//显示集合中的元素
void showSet(SET set){
int i;
for(i = 0; i < set.count; i++){
printf("%c ", set.data[i]);
}
printf("\n");
}
//初始化一个集合:将数组中的值复制到集合中
void initSetFromArray(SET *head, DATA_TYPE ar[], int n){ //n表示字符数组中元素的个数
int i;
for(i = 0; i < n; i++){
head->data[i] = ar[i];
}
head->count = n;
}
//初始化一个空集合
void initSet(SET *set){
set->count = 0;
}
void main(void){
DATA_TYPE a[] = {'a', 'b', 'c', 'd', };
DATA_TYPE b[] = {'a', 'c', 'd', 'e', 'g', 'x'};
SET set1;
SET set2;
SET set3;
SET set4;
initSetFromArray(&set1, a, 4);
printf("第一个集合中的元素为:");
showSet(set1);
initSetFromArray(&set2, b, 6);
printf("第二个集合中的元素为:");
showSet(set2);
initSet(&set3);
unionSet(set1, set2, &set3);
printf("这两个集合的并集中的元素为:");
showSet(set3);
initSet(&set4);
intersectionSet(set1, set2, &set4);
printf("这两个集合的交集中的元素为:");
showSet(set4);
}