完成以下程序,并在右边空白处,对错误进行修改,并记录下程序运行结果:
1.集合合并 描述:已知集合A与集合B,且第个集合内数据是唯一的。求A,B集合合并成新的集合C,要求C集合内的数据也是唯一的。并指出C集合的个数。 输入:三行,第一行分别为集合A,B的个数 输出:两行 |
样例输入 4 5 12 34 56 78 34 67 89 34 76 样例输出 7 12 34 56 78 67 89 76
|
/*时间 2018/9/28 15:52;
作者:一直会疼人的猫 */
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode; //定义LNode这个东西拥有数据data和指针next
void Init(LNode* &L) //创建新的链表,其实实质上是创建一个空的头节点
{
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
}
int ListInsert(LNode* &L, int i, int e) //向L表中的第i个事之前插入数据e,这里可以用于初始赋值,也可以用于后期更改链表的值
{
LNode *p = L; int j = 0;
while(p && j < i- 1){
p = p-> next; j++;}
if(!p || j > i - 1) return 0;
LNode *s =NULL;
s = (LNode*)malloc(sizeof(LNode));
s->data = e; s->next = p->next;
p->next = s;
return 1;
}
int n, m;
int flag[100];
int main()
{
cin >> n >> m; //La中又n个数,Lb表中又m个数
LNode *La;
LNode *Lb;
LNode * Lc;
cout << n << " " << m << endl;
Init(La); Init(Lb); Init(Lc); 定义头指针存在
for(int i = 1;i <= n;i++)
{
int e ;
cin >> e;
ListInsert(La, i, e);
cout << e << " " ;
}
cout << endl;
for(int i = 1;i <= m;i++)
{
int e;
cin >> e;
ListInsert(Lb, i, e);
cout << e << " " ;
}
cout << endl;
LNode *p = La->next; //让 p指针指向La表中的第一个元素
int pos = 1;
while(p)
{
int e = p->data; //e为La表中P指针的元素数据data
if(flag[e] == 0)
{
ListInsert(Lc, pos,e); 向Lc表中给第pos个位置插入原属e
flag[e] = 1;
p = p->next;
pos++;
}
else p = p->next;
}
LNode *q = Lb->next;
while(q)
{
int e = q->data;
if(flag[e] == 0)
{
ListInsert(Lc, pos, e);
flag[e] = 1;
q = q->next;
pos++;
}
else q = q->next;
}
LNode *w = Lc->next;
cout << pos - 1 << endl;
while(w) //输出Lc表中的所有元素
{
cout << w->data << " " ;
w = w->next;
}
cout << endl;
return 0;
}