/************************************
*
* c++程序设计实践指导
*
* 1.5求两个整数集合并集
*
*************************************/
#include <iostream>
using namespace std;
class SET
{
struct LinkNode //单链表节点数据结构
{
int data;
LinkNode *next;
};
LinkNode *head1, *head2, *head3; //3个单链表
int num1, num2, num3; //3个表长
public:
SET(int *x, int len1, int *y, int len2) //构造函数,用len1初始化num1,用len2初始化num2
{
head1 = new LinkNode;
head1->data = -1;
head1->next = NULL;
head2 = new LinkNode;
head2->data = -1;
head2->next = NULL;
head3 = new LinkNode;
head3->data = -1;
head3->next = NULL;
LinkNode *p1, *p2;
p1 = head1;
p2 = head2;
for(int i = 0; i < len1; i++)
{
LinkNode *s = new LinkNode;
s->data = x[i];
s->next = NULL;
p1->next = s;
p1 = s;
}
for(int i = 0; i < len2; i++)
{
LinkNode *s = new LinkNode;
s->data = y[i];
s->next = NULL;
p2->next = s;
p2 = s;
}
num1 = len1;
num2 = len2;
}
int notin(int elem, LinkNode *q) //若elem不在以q为头节点的单链表中则返回1,否则,返回0
{
LinkNode *p = q->next;
while(p)
{
if(elem == p->data)
return 0;
p = p->next;
}
return 1;
}
void insert(); //完成求两集合并集的功能
void desert(); //完成求两集合交集的功能
void show()
{
LinkNode *p = head3->next;
while(p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
cout << "新的集合元素个数是 :" << num3 <<endl;
}
};
void SET::insert() //求两集合并集
{
LinkNode *p1 = head1->next;
LinkNode *p2 = head2->next;
LinkNode *p, *q;
q = head3;
while(p1) //先将单链表1中的元素复制到单链表3中
{
p = new LinkNode;
p->data = p1->data;
p->next = NULL;
q->next = p;
q = p;
p1 = p1->next;
}
num3 = num1;
while(p2) //将在单链表2中而不在单链表1中的元素复制到单链表3中
{
if(notin(p2->data, head3))
{
p = new LinkNode;
p->data = p2->data;
p->next = NULL;
q->next = p;
q = p;
++num3;
}
p2 = p2->next;
}
}
void SET::desert() //求交集
{
LinkNode *p1 = head1->next;
LinkNode *p2 = head2->next;
LinkNode *p, *q;
q = head3;
num3 = 0;
while(p2) //将单链表2与单链表1比较,两者均有的元素加入单链表3中
{
if(notin(p2->data,head1) == 0)
{
p = new LinkNode;
p->data = p2->data;
p->next = NULL;
q->next = p;
q = p;
++num3;
}
p2 = p2->next;
}
}
int main()
{
int s1[] = {1,3,5,7,9};
int s2[] = {2,4,6,9};
SET set(s1, sizeof(s1)/sizeof(s1[0]), s2, sizeof(s2)/sizeof(s2[0]));
cout << "并集:";
set.insert();
set.show();
cout << "交集:";
set.desert();
set.show();
system("pause");
return 0;
}
转载于:https://my.oschina.net/u/862938/blog/111869