使用单链表来实现集合的交并差运算 数据结构
问题描述
该算法的设计,要求运行结果如下所示:
集合的运算如下:
原 集 合A: c a e h
原 集 合B: f h b g d a
有序集合A: a c e h
有序集合B: a b d f g h
集合的并C: a b c d e f g h
集合的交C: a h
集合的差C: c e
代码实现
首先这里交并差的实现是基于链表中的元素已经从小到大排完序的链表。这里排序使用的是冒泡排序。
//链表的冒泡排序算法
bool BubbleSort(LinkList &L) //链表的冒泡排序
{
LinkList p, q, tail;
tail=NULL;
while((L->next->next)!=tail)
{
p=L;
q=L->next;
while(q->next!=tail)
{
if((q->data) > (q->next->data))
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=p->next;
}
q=q->next;
p=p->next;
}
tail=q;
}
return true;
}
//集合的并
bool merge(LinkList &L1, LinkList &L2, LinkList &L3)//集合的并 这里的集合已经排序
{
LinkList p1=L1->next, p2=L2->next, p3=L3, s;
while(p1!=NULL && p2!=NULL)
{
if(p1->data!=p2->data)
{
if(p1->data > p2->data)
swap(p1, p2);
while(p1!=NULL && p1->data < p2->data)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=p1->data;
s->next=NULL;
p3->next=s;
p3=s;
p1=p1->next;
}
}
else
{
s=(LinkList)malloc(sizeof(LNode));
s->data=p1->data;
s->next=NULL;
p3->next=s;
p3=s;
p1=p1->next;
p2=p2->next;
}
}
if(p2!=NULL) //这里统一让p1代表链表中还有剩余元素的那条链
p1=p2;
while(p1!=NULL)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=p1->data;
s->next=NULL;
p3->next=s;
p3=s;
p1=p1->next;
}
return true;
}