C语言通过顺序表来实现集合的运算
1、主要的功能:

2、顺序表的构建:

3、构建一个主函数,并通过switch语句来实现功能选择:

4、由上一步可知,定义了三个集合:La , Lb , Lc ;类型为 SqList 的结构体:
5、菜单功能函数编写:

6、集合初始化函数的编写:

7、集合元素(排序/输出)函数编写:

8、集合A和集合B的并集函数编写:

9、完整代码:
#include <stdio.h>
#include <stdlib.h>
//符号常量定义
//返回值符号常量
//顺序表符号常量
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INIT_SIZE 100
#define LIST_INCREMENT 10
//数据类型定义
typedef int Status;
typedef int ElemType;
//数据存放从0号位置开始
typedef struct //顺序表的(定义)类型
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitSqList(SqList &L) //初始化顺序表函数
{
L.elem = (ElemType *)malloc(INIT_SIZE * sizeof(ElemType));
if(L.elem == NULL)
exit(OVERFLOW);
L.length = 0;
L.listsize = INIT_SIZE;
return OK;
}
Status InputData2Set(SqList &L) //顺序表的信息录入函数
{
int n;
int i;
printf("集合数据个数:");
scanf("%d", &n);
if(n <= 0)
{
printf("\n数据个数错误!\n");
return ERROR;
}
if(n > L.listsize)
{
L.elem = (ElemType *)realloc(L.elem, n * sizeof(ElemType));
if(L.elem == NULL)
return ERROR;
L.listsize = n;
}
for(i = 0; i < n; i++)
{
printf("第 %d 个数据:", i + 1);
scanf("%d", L.elem + i); //&L.elem[i]
}
L.length = n;
return OK;
}
void SortSqList(SqList L)
{
int i, j;
for(i = 0; i < L.length; i++)
for(j = i + 1; j < L.length; j++)
if(L.elem[i] > L.elem[j])
{
L.elem[i] = L.elem[i] + L.elem[j];
L.elem[j] = L.elem[i] - L.elem[j];
L.elem[i] = L.elem[i] - L.elem[j];
}
}
void OutputSetData(SqList L)
{
int i;
printf("\n集合的数据个数:%d!\n", L.length);
if(L.length == 0)
return;
SortSqList(L);
printf("\n集合中的数据为:");
for(i = 0; i < L.length; i++)
printf(" %d ", L.elem[i]);
printf("\n\n");
}
void combine(SqList La,SqList Lb,SqList &Lc)
{
int i,j;
Lc.length = 0;
for(i=0;i<La.length;++i)
{
for(j=0;j<=Lc.length;++j)
if(La.elem[i] == Lc.elem[j])
break;
if(j >= Lc.length)
{
Lc.elem[Lc.length] = La.elem[i];
++Lc.length;
}
}
for(i=0;i<Lb.length;++i)
{
for(j=0;j<=Lc.length;++j)
if(Lb.elem[i] == Lc.elem[j])
break;
if(j >= Lc.length)
{
Lc.elem[Lc.length] = Lb.elem[i];
++Lc.length;
}
}
Lc.listsize = Lc.length;
}
void showmenu()
{
printf("\n**********************************************************\n");
printf("\t\t1 集合A数据输入\n\n");
printf("\t\t2 集合B数据输入\n\n");
printf("\t\t3 集合A数据显示\n\n");
printf("\t\t4 集合B数据显示\n\n");
printf("\t\t5 集合A和集合B的并集\n\n");
printf("\t\t6 集合A和集合B的交集\n\n");
printf("\t\t7 集合A和集合B的差集\n\n");
printf("\t\t0 退出系统\n\n");
printf("**********************************************************\n");
printf("\n");
}
int main()
{
SqList La, Lb, Lc;
if((InitSqList(La) == OK) && (InitSqList(Lb) == OK) && (InitSqList(Lc) == OK))
printf("\n顺序表初始化成功!\n");
else
{
printf("\n顺序表初始化shibai!\n");
return 1;
}
int choice = -1;
while(choice != 0)
{
system("cls");
fflush(stdin);
showmenu();
printf("\t\t功能选择:");
scanf("%d", &choice);
switch(choice)
{
case 1:{
if(La.length > 0)
{
printf("\n集合中存在数据,直接覆盖原来的数据,之后重新输入新数据!");
La.length = 0;
}
if(InputData2Set(La) == OK)
printf("\n集合A中数据输入成功!\n");
else
printf("\n集合A中数据输入失败!\n");
system("pause");
break;}
case 2:{
if(Lb.length > 0)
{
printf("\n集合中存在数据,直接覆盖原来的数据,之后重新输入新数据!");
Lb.length = 0;
}
if(InputData2Set(Lb) == OK)
printf("\n集合B中数据输入成功!\n");
else
printf("\n集合B中数据输入失败!\n");
system("pause");
break;}
case 3:{
OutputSetData(La);
system("pause");
break;}
case 4:{
OutputSetData(Lb);
system("pause");
break;}
case 5:{
combine(La,Lb,Lc);
OutputSetData(Lc);
system("pause");
break;}
case 0:
exit(0);
default:printf("\n功能选择错误,请重新选择!");
}
}
return 1;
}