采用递增有序的顺序表表示集合,求解两个集合的交、并集

来源:互联网 发布:p相片软件下载 编辑:程序博客网 时间:2024/06/05 18:08

采用递增有序的顺序表表示集合,求解两个集合的交、并集

1)定义顺序表的存储结构;

2)实现存储递增有序集合的顺序表的建立、求交集运算;

//  main.cpp

//  数据结构作业

//

//  Created by on 16/10/7.

//  Copyright © 2016 . All rights reserved.

//


#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#define LIST_INIT_SZIE 100


//顺序表的存储结构

typedef struct{

   int *elem;

   int length;

}SqList;


//构造一个空的线性表

int InitList(SqList &l)

{

    l.elem=(int *)malloc(LIST_INIT_SZIE *sizeof(int));

   if(!l.elem)return -1;

    l.length =0;

   return 0;

}


//e返回L中第i个数据元素的值

void GetElem(SqList l,int i,int &e)

{

    e=l.elem[i];

}


//打印顺序表l中的元素

void DispalyElem(SqList l)

{

   for(int i=0;i<l.length;i++)

       printf("%d ",l.elem[i]);

   printf("\n");

}


//插入操作,l中第i个位置之前插入新的元素e

int ListInsert(SqList &l,int i,int e)

{

   if(i<1 || i>l.length+1)return -1;

   int *q = &(l.elem[i-1]);

   for(int *p = &(l.elem[l.length-1]);p>=q;--p)

        *(p+1) = *p;

    *q=e;

    ++l.length;

   return 0;

}


//删除操作,在线性表l中删除第i个元素并用e返回其值;

int  ListDelete(SqList &l,int i,int e)

{

   if(i<1 || i>l.length+1)return -1;

   int *p = &(l.elem[i-1]);

    e=*p;

   int *q=l.elem+l.length-1;

   for(++p;p<=q;++p)

        *(p-1)=*p;

    --l.length;

   return 0;

}


//查找操作,在线性表l中查找与e相同的第一个元素,并返回其下标

int LocateElem(SqList l,int e)

{

   int i;

   for(i=0;i<l.length;i++)

       if(l.elem[i]==e)

           return i+1;

   return 0;

}


/*------------函数功能:求两个线性表的交集------------*/

void Intersection(SqList A,SqList B,SqList &C)

{

    printf("求线性表的交集\n");

   int i,j,k=0;

   for(i=0;i<A.length;i++)

    {

        j=0;

       while(j<B.length && B.elem[j]!=A.elem[i])

            j++;

       if(j<B.length)

        {

            C.elem[k++]=A.elem[i];

        }

    }

    C.length=k;

}


/*------------函数功能:求两个线性表的并集------------*/

void MergeList(SqList A,SqList B,SqList &C)

{

    printf("求线性表的并集\n");

   int res=InitList(C);

   int i=0,j=0,k=0;//?

   int ai,bi;

   while((i<=A.length-1)&&(j<=B.length-1))

    {

       GetElem(A,i,ai);

       GetElem(B,j,bi);

       if(ai<=bi)

        {

            C.elem[k++]=A.elem[i++];

        }

       else

        {

            C.elem[k++]=B.elem[j++];

        }

    }

   while(i<=A.length-1)

    {

       GetElem(A,i,ai);

        C.elem[k++]=A.elem[i++];

    }

   while(j<=B.length-1)

    {

       GetElem(B,j,bi);

        C.elem[k++]=B.elem[j++];

    }

    C.length=k;

}


int main(int argc,const char * argv[]) {

   SqList A,B,C;

   int res;

    res=InitList(A);//初始化线性表A

    res=InitList(B);//初始化线性表B

    //i=InitList(C);

    printf("输入线性表A元素个数:\n");

   scanf("%d",&A.length);

    printf("输入线性表A中的元素:\n");

   for(int j=0;j<A.length;j++)

    {

       scanf("%d",&A.elem[j]);

    }

    printf("输入线性表B元素个数:\n");

   scanf("%d",&B.length);

    printf("输入线性表B中的元素:\n");

   for(int j=0;j<B.length;j++)

    {

       scanf("%d",&B.elem[j]);

    }

   Intersection(A,B,C);

    DispalyElem(C);

   MergeList(A,B,C);

    DispalyElem(C);

   return 0;

}



2 0
原创粉丝点击