数据结构-有序集合的交运算
题目:
假设以两个元素依次递增有序排序排列的线性表 AA 和 BB 分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表 CC,其元素为 AA 和 BB 中的元素的交集,且表 CC 中的元素也依值递增有序排列。试对顺序表编写求 CC 的算法。
输出要求:
输出一共有两行,第一行为线性表 CC 的元素个数。
第二行为线性表 CC 的元素顺序输出的结果,按从小到大的顺序输出,每两个整数之间一个空格,最后一个整数后面没有空格。
#include<iostream>
using namespace std;
//题目要输出线性表的元素个数,那么不妨设置一个静态数据来记录
static int len=0;
//建立链表
struct Node{
int data;
Node*next;
};
//创建链表
void creatList(Node * &head,int n){//n表示链表的长度
Node *s,*p;
s=new Node;
p=new Node;
cin>>s->data;
for(int i=0;i<n;i++){
if(head==NULL)
head=s;
else{
s->next=p;
cin>>p->data;
s=p;
p=new Node;
p->next=NULL;
}
}
delete p;
return;
}
//输出链表
void showList(const Node*head){
if(head!=NULL){
cout<<head->data;
head=head->next;
while (head){
cout<<" "<<head->data;
head=head->next;
}
}
}
//用尾插法插入元素
void insertList(Node*&head,int num){//num是要插入的元素
Node*s, *p, *q;
s=new Node;
s->data=num;
s->next=NULL;
if(head==NULL){//如果表空,那么建立一个节点的链表
head=s;
return ;
}else{
p=head;
q=head->next;
while(q){
p=q;
q=q->next;
}
p->next=s;//查找到表尾,在表尾插入数据
}
len++;
}
//取两个链表的交集,并且按顺序插入链表C中。但是本题的两个链表都是依次递增有序排列的,所以可以省去排序这个步骤
void sortList(Node*headA,Node*headB,Node*&headC){
while(headA!=NULL&&headB!=NULL){
if(headA->data==headB->data){
insertList(headC,headA->data);
headA=headA->next;
headB=headB->next;
continue;
}
if(headA->data<headB->data){
headA=headA->next;
continue;
}
if(headA->data>headB->data){
headB=headB->next;
continue;
}
if(headB->next=NULL)
break;
if(headA->next=NULL)
break;
}
}
int main (){
int a,b;//a,b分别表示两顺序表的个数
Node *ListA=NULL;
Node *ListB=NULL;
Node *ListC=NULL;
//创建两个列表并且输入
cin>>a;
creatList(ListA,a);
cin>>b;
creatList(ListB,b);
//比较两个链表,求两个链表的交集
sortList(ListA,ListB,ListC);
if(ListC==NULL)
cout<<0<<endl;
else
cout<<len+1<<endl;//因为在表尾插入元素的时候,是在尾部指针直接接入新的元素,所以链表长度=len+1;
showList(ListC);
return 0;
}
参考说明
本文参考了这位大佬的文章中部分算法,他是用面向对象的方法。
参考博客原址:https://blog.csdn.net/weixin_43536376/article/details/104906155