实验题目:线性表的顺序存储结构
1.以顺序表表示集合,编制一个能演示执行集合的并,交,差,补运算的程序。
要求
- 集合元素限定为小写字母(‘a’-‘z’),输入可能有非法字符,程序应能自动滤去。
- 演示程序以用户和计算机对话的方式进行,及在计算机上显示提示信息后,用户在键盘上输入演示程序中规定的运行命令,相应的输入数据和运算结果在其后。
- 程序应执行的命令应包括:构造集合,求并交差补集,退出
审题
- 实验要求顺序存储结构,意味着数据的存储应该用数组
- 实验要求的功能,最好一个个自定义函数去实现
算法思路
声明全集p(‘a’-‘z’),
1.以集合A为例,读入的集合A为int类型,长度27,值都为0的数组,数据由c=getchar()读入,判断c是否在集合内,如果在则让A中对应的数值加1。这样,如果A[i]=0,那么对应的p[i]中的字母未出现过,反之如果A[i]>0,则字母p[i]在A中。
2.简单来说,A[0]=0代表p[0]未出现过,也就是A不包含字母a元素。
3.交集,A[i]和B[i]都大于0,并集,A[i]或B[i]大于0,补集,输出A[i]=0
详细代码(笔者只写在一个主函数中,误)
。
#include<stdio.h>
#include<string.h>
#define N 27
int main()
{
char p[N]="abcdefghijklmnopqrstuvwxyz";
char A[N]={0};
char B[N]={0};
char C[N]={0};
char c;int n=0;int m=0;
//集合AB的读入
printf("输入集合A\n");
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z')
{
A[c-'a']++;
}
}
printf("输入集合B\n");
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z')
{
B[c-'a']++;
}
}
//A,B输出
printf("A:");
while(m<=27){
if(A[m]>0)
printf("%c",p[m]);
m++;
}
printf("\nB:");m=0;
while(m<=27){
if(B[m]>0)
printf("%c",p[m]);
m++;
}
printf("\n");
//根据n值的不同选择显示
while(n!=4)
{
m=0;
printf("1.交");
printf("\n2.并");
printf("\n3.补");
printf("\n4.退出");
scanf("%d",&n);
if(n==1)
{
while(m<=27){
if(A[m]>0&&B[m]>0)
printf("%c",p[m]);
m++;
}
printf("\n");
}
else if(n==2)
{
while(m<=27){
if(A[m]>0||B[m]>0)
printf("%c",p[m]);
m++;
}
printf("\n");
}
else if(n==3)
{
printf("A的补集:");
while(m<=27){
if(A[m]==0)
printf("%c",p[m]);
m++;
}
m=0;
printf("B的补集:");
while(m<=27){
if(B[m]==0)
printf("%c",p[m]);
m++;
}
}
else
break;
}
return 0;
}