数据结构之顺序表(集合的交并差)

//c语言
#include<stdio.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define  LISTINCREASE  10 // 线性表存储空间的分配增量
typedef int ElemType;
typedef int Status;
typedef struct
{
  ElemType *elem;/* 存储空间的首地址 */
  int length; /* 当前长度 */
  int listsize;/* 当前分配的存储空间 */
}Sqlist;




//初始化线性表
Status InitList_Sq(Sqlist &L){
  L.elem=(ElemType *)malloc(LIST_INIT_SIZE* sizeof(ElemType));
  if(!L.elem) return -1;//存储分配失败
  L.length=0;//设置长度
  L.listsize=LIST_INIT_SIZE;//设置已经分配的空间
  return 1;
}
//线性表中元素排序(冒泡排序)
void  sort_Sq(Sqlist &L)
{
  int i,j,temp;
  int exchange;
  for(i=0;i<L.length-1;i++)
  {
    exchange=0;
for(j=L.length-2;j>=i;j--)
{
if(L.elem[j+1]<L.elem[j])
{
temp=L.elem[j+1];
L.elem[j+1]=L.elem[j];
L.elem[j]=temp;
exchange=1;
} 
}
if(!exchange) return;
  }


}
//显示各种操作后的结果
void displaylist_Sq(Sqlist &c)
{
if(c.length==0) //判断操作后的集合是否为空
printf("该操作后的集合为空!\n");
for(int i=0;i<c.length;i++)
{
if(c.elem[i]==c.elem[i+1])//删除集合中相同的元素
continue;
else
printf("%d ",c.elem[i]);
}
printf("\n");
}


//求a和b的并集
int unionList(Sqlist &a,Sqlist &b,Sqlist &c)
{
    int i=0,j=0,k=0;
c.length=a.length+b.length;
    c.elem=(ElemType *)malloc(c.length * sizeof(ElemType));
   if(!c.elem) return -1;
   while(i<a.length && j<b.length)
   {
     if(a.elem[i]<b.elem[j]) 
c.elem[k++]=a.elem[i++];
else 
if(a.elem[i]>b.elem[j])
  c.elem[k++]=b.elem[j++];
else 
{
  c.elem[k++]=a.elem[i++];
  j++;
}

   }
  
while(i<a.length) 
c.elem[k++]=a.elem[i++];
while(j<b.length)
c.elem[k++]=b.elem[j++];
c.length=k;
displaylist_Sq(c);


}
//求a和b的交集
void mixdlist_Sq(Sqlist &a,Sqlist &b,Sqlist &c)
{
    int i=0,j=0,k=0;
c.length=a.length>b.length?a.length:b.length;
while(i<a.length  && j<b.length)
{
     if(a.elem[i]<b.elem[j]) i++;
 else if(a.elem[i]>b.elem[j])  
 j++;
else {
 c.elem[k++]=a.elem[i++];
 j++;
 }


}
c.length=k;
   displaylist_Sq(c);
}
//求a和b的差集
void difrentlist_Sq(Sqlist &a,Sqlist &b,Sqlist &c)
{
     int i=0,j=0,k=0;
c.length=a.length>b.length?a.length:b.length;
while(i<a.length  && j<b.length)
{
if(a.elem[i]<b.elem[j]) c.elem[k++]=a.elem[i++];
else 
if(a.elem[i]>b.elem[j]) j++;
else {i++;j++;}
}
while(i<a.length) c.elem[k++]=a.elem[i++];
c.length=k;
       displaylist_Sq(c);
}
/*用在分配c集合的方法来进行求交叉并集*/


int main()   
{
Sqlist  a,b,c;
 int i,j;
InitList_Sq(a);
InitList_Sq(b);    //输入集合a与b的元素
printf("请输入a集合的长度:\n");
scanf("%d",&a.length);
printf("<元素>:\n");
for(i=0;i<a.length;i++)
scanf("%d",&a.elem[i]);
printf("排序后的集合为:\n");
sort_Sq(a);        //给a集合排序
displaylist_Sq(a);
printf("请输入b集合的长度:\n");
scanf("%d",&b.length);
printf("<元素>:\n");
for(i=0;i<b.length;i++)
scanf("%d",&b.elem[i]);
printf("排序后的集合为:\n");
sort_Sq(b);      //给b集合排序
displaylist_Sq(b);
printf("a与b的并集为:\n");
unionList(a,b,c);   //求a与b的并集
printf("a与b的交集为:\n");
mixdlist_Sq(a,b,c);    //求a与b的交集
printf("a-b的差集为:\n");
difrentlist_Sq(a,b,c);     //求a-b的差集
printf("b-a的差集为:\n");
difrentlist_Sq(b,a,c);     //求b-a的差集
return 0;
}

  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值