顺序表实现集合的交并补基本操作
垃圾本科生刚开始学数据结构 记录一下平时实验作业
对于集合的并集实现基本思路:在顺序表A,B均没有遍历完时:利用循环先遍历顺序表A中数据,若比B中数据小,则A中数据指向下一个,并将A中数据放入新顺序表C中。若A中数据等于B,将A中数据存入C中,然后将A,B顺序表同时指向下一个数据,若B中数据小于A中数据,将B中数据存入C中,然后B中数据指向下一个。若A顺序表已经遍历完毕,则将B中数据全部存入C中,并指向下一个。若B中数据已经遍历完毕,同理。
其余对于集合差集和交集的思路类似于并集。
欢迎指正
#include <stdio.h>
#define MAXSIZE 30
typedef int datatype;
typedef struct {
datatype data[MAXSIZE];
int last;
}SeqList;
//实现集合的并
void Union(SeqList A,SeqList B,SeqList *C){
int i=0,j=0,k=0;
while(i<=A.last&&j<=B.last)
{
if(A.data[i]<B.data[j])
{
C->data[k]=A.data[i];
k++;
i++;
}
else if(A.data[i]==B.data[j])
{
C->data[k]=A.data[i];
k++;
i++;
j++;
}
else
{
C->data[k]=B.data[j];
k++;
j++;
}
}
while(i<=A.last)
{
C->data[k]=A.data[i];
k++;
i++;
}
while(j<=B.last)
{
C->data[k]=B.data[j];
k++;
j++;
}
C->last=k-1;
}
//以下是两种实现交集的方法
//方法一
void intersection (SeqList A,SeqList B,SeqList *C)
{
int i,k,j;
i=0;
k=0;
j=0;
while(i<=A.last&&j<=B.last)
{
if(A.data[i]==B.data[j])
{
C->data[k]=A.data[i];
i++;
k++;
j++;
}
else if(A.data[i]<B.data[j])
{
i++;
}
else{
j++;
}
}
C->last=k-1;
}
//方法二利用for循环,利用变量t控制循环可以优化时间复杂度
void intersection(SeqList A,SeqList B,SeqList *C){
int i,j,k,t;
i=0;
j=0;
k=0;
t=0;
for(i=0;i<A.last;i++)
{
for(j=t;j<B.last;j++)
{
if(A.data[i]==B.data[j])
{
C->data[k]=B.data[j];
k++;
C->last++;
}
if(A.data[i]<B.data[j])
{
t=j;
break;
}
}
}
}
//实现集合的差
void differnce(SeqList A,SeqList B,SeqList *C)
{
int i=0,j=0,k=0;
while(i<=A.last&&j<B.last)
{
if(A.data[i]<B.data[j])
{
C->data[k]=A.data[i];
k++;
i++;
}
else if(A.data[i]==B.data[j])
{
i++;
j++;
}
else
{
j++;
}
}
while(i<=A.last)
{
C->data[k]=A.data[i];
k++;
i++;
}
C->last=k-1;
}
void output(SeqList A){
for(int i=0;i<=A.last;i++)
{
printf("%d ",A.data[i]);
}
return;
}
int main()
{
int i=0;
SeqList A={{20,30,40,50,60,70,80,90,100},8};
SeqList B={{15,20,25,35,40,55,60,75,85,95},9};
SeqList C,D,E;
Union(A,B,&C);
differnce(A,B,&C);
output(C);
}