实验2 顺序表的应用(集合运算)

实验内容:

(1)创建一个空的集合;

(2)从数组元素建立集合;

(3)查找集合中是否存在元素x;

(4)往集合中增加元素x;    (未做)

(5)删除集合的元素x;     (未做)

(6)求两个集合的并集;

(7)求两个集合的交集;

(8)输出集合。

get到的知识点:

1.对于下面这种定义顺序表的方式,若主函数中直接定义了一个SET set; 则不再需要malloc动态分配存储空间,切记!

typedef struct SQ_LIST{
    DATA_TYPE data[MAXSIZE];
    int count;
}SET;

2.如何将一个字符数组作为参数传到子函数中

void initSetFromArray(SET *head, DATA_TYPE ar[], int n);

void main(void){
    DATA_TYPE a[] = {'a', 'b', 'c', 'd', };
    DATA_TYPE b[] = {'a', 'c', 'd', 'e', 'g', 'x'};

    initSetFromArray(&set1, a, 4);
}  //这个还需仔细研究研究??????

3.语句简化

            head->data[head->count] = set2.data[i];
            head->count++;
            //上面两句话等价于  head->data[head->count++] = set2.data[i];
            //先用原值进行计算,然后+1
 

算法设计:

用线性表来存储集合,结构体中包含集合的大小、存放集合的数组。

#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);


}

猜你喜欢

转载自blog.csdn.net/weixin_42072280/article/details/83617336