采用递增有序的顺序表表示集合,求解两个集合的交、并集
(1)定义顺序表的存储结构;
(2)实现存储递增有序集合的顺序表的建立、求交集运算;
// main.cpp
// 数据结构作业
//
// Created by 周 on 16/10/7.
// Copyright © 2016年 周. All rights reserved.
//
#include
#include
#include
#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
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
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
{
j=0;
while(j
j++;
if(j
{
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
{
scanf("%d",&A.elem[j]);
}
printf("输入线性表B元素个数:\n");
scanf("%d",&B.length);
printf("输入线性表B中的元素:\n");
for(int j=0;j
{
scanf("%d",&B.elem[j]);
}
Intersection(A,B,C);
DispalyElem(C);
MergeList(A,B,C);
DispalyElem(C);
return 0;
}