利用单链表求两个集合的交集,利用前文写好的链表的框架,在链表类中补充Intersection方法。
利用单链表两个集合的交集
一、问题分析
利用单链表两个集合的交集。
二、代码分析
使用单链表first1和单链表first2实现求集合的交集,用指针p指向first1的首元节点,判断其在first2中是否出现过,如果出现过,则输出p->data;后移p,直到first1中所有元素点都被判断一遍为止。
1.链表类LinkList
在链表类中声明Union方法。
/*位于LinkList.h文件中*/
template <class ElemType>
class LinkList{
public:
LinkList();//构造函数
~LinkList();//析构函数
void Insert(int i ,ElemType x);//插入函数
void PrintList();//打印所有元素
int Length();//获取链表长度
ElemType Get(int i) ;//按位查找,返回第i个元素的值
int Locate(ElemType x) ;//按值查找,返回x在单链表中的位置
ElemType Delete(int i) ;//删除第i个元素
Node<ElemType>* GetFirst(){return first;};
void Intersection(LinkList<ElemType>& L) ;
private:
Node<ElemType>* first; //头指针
};
2.链表方法Intersection
/*位于LinkList.cpp文件中*/
template <class ElemType>
void LinkList<ElemType>::Intersection(LinkList<ElemType>& L)
{
Node<ElemType>* L1_First=this->first;
Node<ElemType>* p=L1_First->next;
while(p!=NULL)
{
/*在L2中查找p的数据是否存在*/
int i=L.Locate(p->data) ;
//如果存在,则输出,直到L1遍历结束
if(i!=0)
{
cout<<p->data<<" ";
}
p=p->next;
}
cout<<endl;
}
三、测试代码
1.主函数
#include <iostream>
#include "LinkList.h"
#include "LinkList.cpp"
using namespace std;
int main() {
LinkList<int> L1;
/*插入元素*/
L1.Insert(1,1);
L1.Insert(2,2);
L1.Insert(3,3);
L1.Insert(4,4);
L1.Insert(5,7);
L1.Insert(6,10);
cout<<"L1链表数据:" <<endl;
L1.PrintList();
LinkList<int> L2;
/*插入元素*/
L2.Insert(1,1);
L2.Insert(2,3);
L2.Insert(3,4);
L2.Insert(4,6);
L2.Insert(5,8);
L2.Insert(6,11);
cout<<"\nL2链表数据:" <<endl;
L2.PrintList();
cout<<"\nL1和L2的并集:"<<endl;
L1.Intersection(L2);
//L1.PrintList();
return 1;
}
2.输出结果
L1链表数据:
1 2 3 4 7 10
L2链表数据:
1 3 4 6 8 11
L1和L2的交集:
1 3 4
四、源代码获取(免积分)
利用单链表实现两个集合的交集