#include<iostream>
using namespace std;
typedef int elem;
typedef struct list
{
elem data;
struct list *next;
}node,*link;
//链表初始化
void initialize(link &L)
{
L=new node;
L->next=NULL;
}
//前插法建立链表
void createlist_head(link &L)
{
node *p=NULL;
int n;
cout<<"How many elements do you want to build in the list?"<<endl;
cin>>n;
cout<<"please input data:"<<endl;
initialize(L);
for(int i=0;i<n;i++)
{
p=new node;
if(!p)
exit(0);
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
//找交集 (无论是有序还是无序都可以)
void intersection(link &A,link &B)
{
node *p1=A->next,*p2=B->next,*q=NULL;
A->next=NULL;
while(p1)
{
p2=B->next;
while(p2)
{
if(p1->data==p2->data)
{
q=p1;
p1=p1->next;
q->next=A->next; //如果没有上一步 p1=p1->next;那么这一步会令p1找不到p1->next;
A->next=q;
break;
}
p2=p2->next;
}
if(!p2)
p1=p1->next;
// cout<<"aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
}
}
//冒泡法排序
void sort_Bubble(link &L)
{
int flag=0,end=L->data,tem;
while(end!=1)
{
node *p=NULL,*q=NULL;
p=L->next;
while(p)
{
q=p;
p=p->next;
if(p)
if(q->data>p->data)
{
tem=p->data;
p->data=q->data;
q->data=tem;
flag=1;//只要有交换就变为1,否则,说明本来就是升序的。
}
}
if(flag==0)
break;
end--;
}
}
//找交集(只适用于找两个递增序列的交集)
void Intersection(link &La,link &Lb,link &Lc)
{
node *pa=La->next,*pb=Lb->next,*pc=NULL,*u=NULL;
Lc=pc=La;
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;
}
void show(link &L)
{
node *p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
link A,B,C;
createlist_head(A);
sort_Bubble(A);
show(A);
createlist_head(B);
sort_Bubble(B);
show(B);
Intersection(A,B,C);
show(C);
}
找以两个链表为基础存储的集合的交集
最新推荐文章于 2024-09-08 15:12:17 发布