1. 程式人生 > >用順序表求集合的交集、並集和差集

用順序表求集合的交集、並集和差集

  使用順序表時, 需要定義一個數組來儲存順序表中的所有元素和定義一個整型變數來儲存順序表的長度。假定陣列用data[MaxSize]表示,長度整型變數用length表示,並採用結構體型別表示,元素型別採用通用型別識別符號ElemType,則順序表的儲存結構定義如下:  

#define MaxSize 50
typedef int ElemType;
typedef struct{
    ElemType data[MaxSize];
    int length;
}SqList;

1) 用順序表,求集合A與B交集
  思路:求C=AB, C中元素是AB中的公共元素。掃描A

中的元素A.data[i],若它與B中某個元素相同,表示是交集元素,將其放到C中,演算法如下:

//求AB
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的並集
  思路:求C=AB中元素為AB中非重複出現的所有元素。現將A複製到C中,然後掃描B中的元素B.data[i], 若它與A中所有元素均不相同,表示是並集元素,將其放到C中。演算法如下:  

//求AB
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之間的差集
思路:求C=AB, C中元素為A中所有不屬於B的元素, 然後掃描A中的元素A.data[i], 若它與B中所有元素均不相同,表示是差集元素,將其放到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
#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>

//求AB
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;

}

//求AB
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=AB
    //Intersection(A,B,C);  

    //2) C=AB
    Union(A,B,C);

    //3) C=A-B
    //Different(A,B,C);

    DispList(C);


}

效果如下:

這裡寫圖片描述
圖(1) 交集C=AB

這裡寫圖片描述
圖(2) 並集C=AB

這裡寫圖片描述
圖(3) 差集C=AB

圖示操作如下:
這裡寫圖片描述
圖(4) C=AB

這裡寫圖片描述
圖(5) C=AB

這裡寫圖片描述
圖(6) C=AB