(3)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A与B的交集,并存放在A链表中。
#include <iostream>
using namespace std;
typedef int ElemType;
//定义存储
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表初始化
void CreateList_L(LinkList &L,int n){
L=new LNode;
L->next=NULL; //先建立一个带头结点的单链表
LinkList p; // InitList_L(L);
cout<<"输入数值"<<endl;
for(int i=n;i>0;--i){
p=new LNode; //生成新结点
cin>>p->data; //输入元素值
p->next=L->next;L->next=p; //插入到表头
}
}
void PrintList_L(LinkList &L)
{
LinkList p=L->next;
while(p) {
cout<<p->data<<endl;
p=p->next;
}
}
//链表有序化
void sort(LinkList &L){
LNode *p, *pre;
LNode *s;
p = L->next;
s = p->next; //s指向要进行操作的链表
p->next = NULL; // 构成一个只含一个数据结点的有序表,初始时只有一个元素
while (s!=NULL)
{
p = s; //p指向当前链表要进行操作的元素
s = s->next; //s继续指向链表的下一个结点
pre = L;
while (pre->next != NULL && pre->next->data <p->data)
{
pre = pre->next; //在有序表中找到插入位置
}
p->next = pre->next;//在有序表的相应位置插入
pre->next = p;
}
}
void JIAOJI(LinkList &La, LinkList &Lb, LinkList &Lc)
{ //pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点
LinkList pa = La->next;
LinkList pb = Lb->next;
LinkList pc;
Lc = pc = La;//用La的头结点作为Lc的头结点
LinkList u; //用于删除节点
while (pa&&pb)
{
if (pa->data == pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
//删除节点
u = pb;
pb = pb->next;
delete u;
}
else if (pa->data < pb->data)
{
u = pa;
pa = pa->next;
delete u;
}
else
{
u = pb;
pb = pb->next;
delete u;
}
}
while (pa)
{
u = pa;
pa = pa->next;
delete u;
}
while (pb)
{
u = pb;
pb = pb->next;
delete u;
}
pc->next = NULL; //尾节点置为空
delete Lb; //释放Lb的头节点
}
int main()
{
LinkList La, Lb, Lc;
int n1, n2;
cout << "请分别输入AB链表的个数:"<<endl;
cin>>n1;
cin>>n2;
//构建链表
CreateList_L(La, n1);
sort(La);
CreateList_L(Lb, n2);
sort(Lb);
cout<<"链表有序化:"<<endl;
cout<<"LA:"<<endl;
PrintList_L( La );
cout<<"LB:"<<endl;
PrintList_L( Lb );
//开始
JIAOJI(La, Lb, Lc);
//输出
cout<<"交集是:"<<endl;
PrintList_L(Lc);
return 0;
}