数据结构之顺序表(集合的交并差)
来源:互联网 发布:淘宝自动发卡条件 编辑:程序博客网 时间: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;}