顺序表实现交集,并集,差集

这篇博客记录了使用顺序表实现集合的交、并、差的基本操作。并集实现中,通过循环比较两个顺序表A和B的数据,将较小或相等的元素存入新顺序表C。交集方法一和方法二分别通过逐个比较和利用for循环优化时间复杂度。差集操作则是在A小于B或相等时不考虑B的元素。博客提供了具体的C语言代码实现。
摘要由CSDN通过智能技术生成

顺序表实现集合的交并补基本操作

垃圾本科生刚开始学数据结构 记录一下平时实验作业
对于集合的并集实现基本思路:在顺序表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);   
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值