题目描述
有两个链表a和b,设节点中包含学号、成绩。从a链表中删去b链表中有相同学号的那些节点。
输入
第一行有两个用空格隔开的整数n和m,分别表示a和b两个链表中的节点个数。保证n和m均不超过100。
之后的n行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
最后的m行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
a和b两个链表中的节点并不一定按照学号顺序排列。保证a链表中学号各不相同,b链表中学号各不相同。
输出
首先输出a链表最终剩下的节点个数k。
在接下来的k行,每行输出两个用空格隔开的整数,分别表示一个学生的学号和成绩。
请注意行尾输出换行。
样例输入
3 3
106 90
104 80
101 85
104 95
106 88
105 87
样例输出
1
101 85
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct Node
{
int data1;
int data2;
struct Node *next;
}node,* pnode;
pnode creat_list(int len);
void traverse_list(pnode phead1,pnode phead2,int len);
int main()
{
int n,m;
cin>>n>>m;
pnode a=NULL;
pnode b=NULL;
a=creat_list(n);
b=creat_list(m);
traverse_list(a,b,n);
return 0;
}
pnode creat_list(int len)
{
int val1,val2;
pnode phead=(pnode)malloc(sizeof(node));
phead->next=NULL;
pnode ptail=phead;
for(int i=0;i<len;i++)
{
cin>>val1>>val2;
pnode pnew =(pnode)malloc(sizeof(node));
pnew->data1=val1;
pnew->data2=val2;
ptail->next=pnew;
pnew->next=NULL;
ptail=pnew;
}
return phead;
}
void traverse_list(pnode phead1,pnode phead2,int len)
{
pnode p1=phead1,p2;
int cnt=0;
int flag=1;
while(p1->next!=NULL)
{
for(p2=phead2->next;p2!=NULL;p2=p2->next)
{
if(p1->next->data1==p2->data1)
{
cnt++;
pnode r=p1->next;
p1->next=r->next;
flag=0;
free(r);
break;
}
}
/*if(flag)
p1=p1->next;*/
if(flag==0)
{
flag=1;
}
else
p1=p1->next;
}
cout<<len-cnt<<endl;
pnode p=phead1->next;
while(p!=NULL)
{
cout<<p->data1<<" "<<p->data2<<endl;
p=p->next;
}
}