数据结构题解:链表 La\Lb创建,插入数据,合并形成新链表Lc

完成以下程序,并在右边空白处,对错误进行修改,并记录下程序运行结果:

 

1.集合合并

描述:已知集合A与集合B,且第个集合内数据是唯一的。求A,B集合合并成新的集合C,要求C集合内的数据也是唯一的。并指出C集合的个数。

输入:三行,第一行分别为集合A,B的个数
第二行为A集合的数据
第三行为B集合的数据

输出:两行
第一行集合C的个数
第二行为C集合的数据

 

 

 

样例输入

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值