已知两个链表A和B分别表示两个集合,其元素递增排列。
请设计一个算法,用于求出A与B的交集,并存放在A链表中
#include <iostream>
using namespace std;
typedef int ElemType;
typedef int status;
//定义单链表
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode ,*LinkList;
//尾插法创建单链表
LinkList CreatList_R(LinkList &L, int n)
{
L = new LNode; //为新结点开辟空间
L->next = NULL; //初始化,结点的Next域置空
LNode *r = L; //尾指针指向头结点
for (int i = 0; i < n; i++)
{
LNode *p = new LNode; //生成新结点
cin >> p->data;
p->next = NULL; //新结点next域置空
r->next = p; //尾结点的next指向新结点p(此时P为新的尾结点)
r = p; //然后将p赋给尾结点r
}
return L;
}
//输出
int DispList(LinkList L)
{
LNode *p = L->next; //令结点P指向链表的首元结点
while(p != NULL) //如果p不为空,说明链表中有元素
{
cout << p->data << ' '; //输出表中元素
p = p->next; //P指向下一个结点,直到p为空
}
return 0;
}
//求交集
/*****************************************************
分析:
只有同时出现在两集合中的元素才出现在结果表中,合并后的新表使用头指针Lc指向。
pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开
始进行比较,当两个链表La和Lb均为到达表尾结点时,如果两个表中相等的元素时,摘取
La表中的元素,删除Lb表中的元素:如果其中一个表中的元素较小时,删除此表中较小的
元素,此表的工作指针后移。当链表La和Lb有一个到达表尾结点,为空时,依次删除另一
个非空表中的所有元素。
*******************************************************/
void MixList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LNode *pa, *pb, *pc, *q; //生成新结点指针pa, pb, pc
pa = La->next; //指针pa指向La表的首元结点
pb = Lb->next; //指针pb指向Lb表的首元结点
Lc = pc = La; //用La的头结点作为Lc的头结点
while (pa && pb)
{
if (pa->data == pb->data) //有相同元素
{
pc->next = pa; //把La的元素存在Lc里面
pc = pa;
pa = pa->next;
q = pb;
pb = pb->next;
delete q; //删除Lb的元素
}
else if (pa->data < pb->data) //不相同时,谁小,删除谁,指针后移
{
q = pa;
pa = pa->next;
delete q;
}
else
{
q = pb;
pb = pb->next;
delete q;
}
}
while (pa) //Lb空了,就把La的元素依此删除
{
q = pa;
pa = pa->next;
delete q;
}
while (pb) //同上
{
q = pb;
pb = pb->next;
delete q;
}
pc->next = NULL;
delete Lb;
}
int main(void)
{
LinkList La;
LinkList Lb;
LinkList Lc;
int n;
cout << "请输入A集合元素的个数:" << endl;
cin >> n;
cout << "请依次输入需要存入的数据:" << endl;
CreatList_R (La,n);
cout << "请输入B集合元素的个数:" << endl;
cin >> n;
cout << "请依次输入需要存入的数据:" << endl;
CreatList_R (Lb,n);
cout << "集合A为:" ;
DispList (La);
cout << endl;
cout<<"集合B为:" ;
DispList (Lb);
cout << endl;
MixList (La, Lb, Lc);
cout << "二者的交集为:" ;
DispList (La);
}
数据结构第二章课后习题第三题(求交集)
最新推荐文章于 2023-10-10 23:30:19 发布