两个有序单链表求差集
前言
用于个人学习过程记录
题目
各依次输入递增有序若干个不超过100的整数,分别建立两个递增有序单链表,分别表示集合A和集合B。设计算法求出两个集合A和B 的差集
(即仅由在A中出现而不在B中出现的元素所构成的集合),并存放于A链表中。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。
然后输出求的差集的单链表。测试数据保证结果链表至少存在一个元素。
输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先在第一行输入数据个数n及n个依次递增有序的不超过100的整数,
再在第二行输入数据个数m及m个依次递增有序的不超过100的整数。
输出格式:
对于每组测试,输出A与B的差集的单链表,每两个数据之间留一个空格。
输入样例:
1
11 10 14 23 25 26 31 34 42 51 65 90
10 10 41 42 46 51 58 59 60 68 97
输出样例:
14 23 25 26 31 34 65 90
代码
#include<iostream>
using namespace std;
struct LNode{
int data;
LNode *next;
};
struct LinkList{
LNode *head;
void Init();
void create(int n);
void traveser();
};
void LinkList::Init(){
head = new LNode;
head->next=NULL;
}
void LinkList::create(int n){
Init();
LNode *q= head;
while(n--){
LNode *p =new LNode;
cin>>p->data;
p->next=q->next;
q->next=p;
q=p;
}
}
void LinkList::traveser(){
LNode *p=head->next;
while(p){
if(p!=head->next) cout<<" ";
cout<<p->data;
p=p->next;
}
cout<<endl;
}
void deleteList(LinkList La,LinkList Lb){
for(LNode *p=La.head;p!=NULL;){
bool flag = false;
for(LNode *q=Lb.head->next;q!=NULL;q=q->next){
if(p->next && p->next->data==q->data){
LNode *r=p->next;
p->next=r->next;
delete r;
flag = true;
break;
}
}
if(flag==false)p=p->next;
}
}
int main(){
int T;
cin>>T;
while(T--)
{
LinkList a,b;
int n,m;
cin>>n;
a.create(n);
cin>>m;
b.create(m);
deleteList(a,b);
a.traveser();
}
}