用順序表求集合的交集、並集和差集
阿新 • • 發佈:2019-02-02
使用順序表時, 需要定義一個數組來儲存順序表中的所有元素和定義一個整型變數來儲存順序表的長度。假定陣列用data[MaxSize]表示,長度整型變數用length表示,並採用結構體型別表示,元素型別採用通用型別識別符號ElemType,則順序表的儲存結構定義如下:
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
1) 用順序表,求集合A與B交集
思路:求
//求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;
}
2) 用順序表,求集合A與B的並集
思路:求
//求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; //修改集合長度
}
3) 用順序表,求集合A與B之間的差集
思路:求
//求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
#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;
}
//主函式.cpp
#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; //修改集合長度
}
void 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);
}
效果如下:
圖示操作如下: