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

来源:互联网 发布:淘宝自动发卡条件 编辑:程序博客网 时间:2024/04/30 02:40

//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;elseprintf("%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;}

原创粉丝点击