问题描述:
解决思路:
- 建表
- 以L2的元素为标准,对L1进行操作
- 销毁链表
源代码
#include <iostream>
#include <malloc.h>
using namespace std;
struct Node
{
int v;
Node* next;
};
struct LinkList
{
int num;
Node* head;
Node* rear;
};
//建表
void Creat(LinkList& L)
{
cin>>L.num;
L.head=(Node*)malloc(sizeof(Node));
if(!L.head)
{
exit(1);
}
L.head->next=NULL;
L.rear=L.head;
for(int i=0;i<L.num;i++)
{
L.rear->next=(Node*)malloc(sizeof(Node));
if(!L.rear->next)
{
exit(1);
}
L.rear=L.rear->next;
cin>>L.rear->v;
L.rear->next=NULL;
}
}
void Print(LinkList& L)
{
if(L.head)
{
Node* p=L.head->next;
while(p)
{
cout<<p->v<<' ';
p=p->next;
}
cout<<endl;
}
}
//求L1与L2的交集 且去除重复的节点
void Intersection(LinkList& L1,LinkList L2)
{
Node* p1=L1.head->next;
Node* pre=L1.head;//记录P1的前驱
Node* p2=L2.head->next;
while(p2&&p1)
{
//以当前P2为基准对P1进行改变
while(p1&&p1->v<p2->v)
{
Node* t=p1;
pre->next=p1->next;
p1=p1->next;
free(t);
}//去除比P2小的元素
if(p1&&p1->v==p2->v)
{
Node* t;
t=p1->next;
while(t&&t->v==p2->v)
{
p1->next=t->next;
free(t);
t=p1->next;
}
pre=p1;
p1=p1->next;
}//消重 消重之后可以跳过当前P1
p2=p2->next;
}
pre->next=NULL;
while(p1)//若L1还有剩余元素则释放
{
Node* t=p1->next;
free(p1);
p1=t;
}
}
//销毁链表
void Del(LinkList& L1,LinkList& L2)
{
Node* head=L1.head;
L1.head=NULL;
while(head)
{
Node* temp=head;
head=head->next;
free(temp);
}
head=L2.head;
L2.head=NULL;
while(head)
{
Node* temp=head;
head=head->next;
free(temp);
}
}
int main()
{
LinkList L1,L2;
Creat(L1);
Creat(L2);
Intersection(L1,L2);
Print(L1);
Del(L1,L2);
Print(L1);
Print(L2);
return 0;
}