//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;
}
数据结构之顺序表(集合的交并差)
最新推荐文章于 2021-04-06 11:53:11 发布