#include<bits/stdc++.h>
using namespace std;
//结点
typedef struct Lnode {
int data;
struct Lnode *next;
}Lnode, *Linklist;
//尾插
void Creatlist(Linklist &L, int &e) {
Lnode *p = new Lnode;
p->data = e;
p->next = NULL; //处理新加入节点
Lnode *cur = L;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = p;
p->next = NULL;
}
//初始化
void Initlist(Linklist &L) {
L = new Lnode;
L->next = NULL;
}
//求差集
void Uniq(Linklist &L1, Linklist &L2, queue <int> &myqueue) {
Lnode *c1 = L1->next;
Lnode *c2 = L2->next;
while (c1&&c2)//A和B都不空时
{
if (c1->data == c2->data) {
c1 = c1->next;
c2 = c2->next;
}
else if (c1->data > c2->data) {
c2 = c2->next;
}
else if(c1->data<c2->data) {
myqueue.push(c1->data);
c1 = c1->next;
}
}
while (c1!=NULL) //A有未遍历元素
{
myqueue.push(c1->data);
c1 = c1->next;
}
while (c1==NULL)
{
break;
}
}
int main() {
int n, m;
while (scanf("%d %d",&n,&m)!=EOF) {
if (n == 0 && m == 0) break;
Linklist L1; //表A
Initlist(L1);
Linklist L2; //表B
Initlist(L2);
for (int i = 0; i < n; i++) { //建A
int e;
cin >> e;
Creatlist(L1, e);
}
for (int i = 0; i < m; i++) { //建A
int e;
cin >> e;
Creatlist(L2, e);
}
queue <int> myqueue;//用队列存储交集的'元素'
Uniq(L1, L2, myqueue);//求差集
int count = 0;//统计差集元素个数
while (!myqueue.empty()) //输出差集
{
if(myqueue.size()>1){
count++;
cout << myqueue.front()<<" ";
myqueue.pop();
}
else
{
count++;
cout << myqueue.front() << endl;
myqueue.pop();
}
}
printf("%d\n", count);//元素个数
}
}
BJFU 228基于链表的两个集合的差集
最新推荐文章于 2024-03-08 17:46:04 发布