使用顺序表时, 需要定义一个数组来存储顺序表中的所有元素和定义一个整型变量来存储顺序表的长度。假定数组用data[MaxSize]表示,长度整型变量用length表示,并采用结构体类型表示,元素类型采用通用类型标识符ElemType,则顺序表的存储结构定义如下:
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
- 用顺序表,求集合A与B交集
思路:求 C = A ⋂ B C=A \bigcap B C=A⋂B, C C C中元素是 A 、 B A、B A、B中的公共元素。扫描 A A A中的元素 A . d a t a [ i ] A.data[i] A.data[i],若它与 B B B中某个元素相同,表示是交集元素,将其放到 C C C中,算法如下:
//求A∩B
void Intersection(SqList *&A,SqList *&B,SqList *&C){
int i,j,k=0;
for (i=0;i<A->length;i++)
{
j=0;
while(j<B->length && B->data[j]!=A->data[i])
j++;
if (j<B->length) //表示A->data[i]在B中,将其放到C中
{
C->data[k++]=A->data[i];
}
}
C->length=k;
}
- 用顺序表,求集合A与B的并集
思路:求 C = A ⋃ B C=A \bigcup B C=A⋃B中元素为 A A A和 B B B中非重复出现的所有元素。现将 A A A复制到 C C C中,然后扫描 B B B中的元素 B . d a t a [ i ] B.data[i] B.data[i], 若它与 A A A中所有元素均不相同,表示是并集元素,将其放到 C C C中。算法如下:
//求A∪B
void Union(SqList *&A,SqList *&B,SqList *&C){
int i,j,k=0;
for(i=0;i< A->length;i++)
C->data[i]=A->data[i];
C->length=A->length;
for (i=0;i< B->length;i++)
{
j=0;
while(j< A->length && B->data[i] != A->data[j])
j++;
if(j==A->length)
C->data[C->length+k++] = B->data[i];
//k++;
}
C->length += k; //修改集合长度
}
- 用顺序表,求集合A与B之间的差集
思路:求 C = A − B C=A-B C=A−B, C C C中元素为 A A A中所有不属于 B B B的元素, 然后扫描 A A A中的元素 A . d a t a [ i ] A.data[i] A.data[i], 若它与 B B B中所有元素均不相同,表示是差集元素,将其放到 C C C中。算法如下:
//求A-B
void Different(SqList *&A, SqList *&B,SqList *&C){
int i,j,k=0;
for (i=0;i<A->length;i++)
{
j=0;
while(j< B->length && B->data[j] != A->data[i])
j++;
if(j==B->length) //表示A->data[i]不在B中,将其放到C中
C->data[k++]=A->data[i];
}
C->length=k; //修改集合长度
}
完整代码如下:
ShunBase.h和ShunMain.cpp要放到同一个目录下。
头文件:ShunBase.h
主文件:ShunMain.cpp
1) 头文件: ShunBase.h
//头文件:ShunBase.h
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
void InitList(SqList *&L){
L=(SqList*)malloc(sizeof(SqList));
L->length=0;
}
void DestroyList(SqList *L){
free(L);
}
int ListEmpty(SqList *L){
return (L->length==0);
}
int ListLength(SqList *L){
return (L->length);
}
void DispList(SqList *L){
int i;
if(ListEmpty(L)) return;
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
}
int GetElem(SqList *L,int i,ElemType &e){
if(i<1 || i>L->length)
return 0;
e=L->data[i-1];
return 1;
}
int LocateElem(SqList *L,ElemType e){
int i=0;
while (i<L->length && L->data[i]!=e) i++;
if(i>=L->length)
return 0;
else
return i+1;
}
int ListInsert(SqList *&L,int i,ElemType e){
int j;
if(i<1 || i>L->length+1)
return 0;
i--; //将逻辑序号转化为存储序号
for(j=L->length;j>i;j--) //将data[i]及其以后元素,依次后移
L->data[j]=L->data[j-1];
L->data[i]=e; //在i处插入元素e
L->length++; //顺序表长度加1
return 1;
}
int ListDelete(SqList *&L,int i,ElemType &e){
int j;
if(i<1 || i>L->length)
return 0;
i--;
e=L->data[i];
for(j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
return 1;
}
2) 主文件: ShunMain.cpp
//主函数.cpp
#include <stdlib.h>
#include "ShunBase.h"
#include <stdio.h>
//求A∩B
void Intersection(SqList *&A,SqList *&B,SqList *&C){
int i,j,k=0;
for (i=0;i<A->length;i++)
{
j=0;
while(j< B->length && B->data[j]!=A->data[i])
j++;
if (j< B->length) //表示A->data[i]在B中,将其放到C中
{
C->data[k++]=A->data[i];
}
}
C->length=k;
}
//求A∪B
void Union(SqList *&A,SqList *&B,SqList *&C){
int i,j,k=0;
for(i=0;i< A->length;i++)
C->data[i]=A->data[i];
C->length=A->length;
for (i=0;i< B->length;i++)
{
j=0;
while(j< A->length && B->data[i] != A->data[j])
j++;
if(j==A->length)
C->data[C->length+k++] = B->data[i];
//k++;
}
C->length += k; //修改集合长度
}
//求A-B
void Different(SqList *&A, SqList *&B,SqList *&C){
int i,j,k=0;
for (i=0;i<A->length;i++)
{
j=0;
while(j< B->length && B->data[j] != A->data[i])
j++;
if(j==B->length) //表示A->data[i]不在B中,将其放到C中
C->data[k++]=A->data[i];
}
C->length=k; //修改集合长度
}
int main()
{
//printf("1+2=3\n");
SqList *Ls = (SqList *)malloc(sizeof(SqList));
Ls->length=0;
//printf("%d\n",Ls->length);
//插入元素
// int i=0;
// for (i=0;i<10;i++)
// {
// ListInsert(Ls,i,i);
// }
// DispList(Ls);
// ElemType e;
// //获取第一个元素
// GetElem(Ls,1,e);
// printf("\n%d\n",e);
// //获取第三个元素
// GetElem(Ls,3,e);
// printf("%d\n",e);
// //在第3个元素之后,插入15
// ListInsert(Ls,3,15);
// DispList(Ls);
SqList *A = (SqList*)malloc(sizeof(SqList));
A->length=0;
A->data[0]=2;
A->data[1]=5;
A->data[2]=10;
A->data[3]=7;
A->data[4]=16;
A->length=5;
SqList *B = (SqList*)malloc(sizeof(SqList));
B->data[0]=3;
B->data[1]=5;
B->data[2]=7;
B->length=3;
SqList *C = (SqList*)malloc(sizeof(SqList));
C->length=0;
DispList(A);
DispList(B);
//1) C=A∩B
//Intersection(A,B,C);
//2) C=A∪B
Union(A,B,C);
//3) C=A-B
//Different(A,B,C);
DispList(C);
system("pause");
return 0;
}
效果如下:



图示操作如下:


