记录这道题是因为被一个bug磨了很久很久,大概4个小时(自闭了), 一直以为是自己的单链表知识不够才错的,妹想到是因为出现死循环…
问了同学才知道错在这里:
while(p1!=NULL)
{
p2=s2;
//这里!!!!!!!!!!!!!
while(p1->data!=p2->data&&p2)
{
p2=p2->next;
}
if(p1->data==p2->data)
{
LNode *pr=new LNode;
pr->data=p1->data;
pr->next=NULL;
if(L==NULL)
{
L=pr;
p3=L;
}
else
{
p3->next=pr;
p3=pr;
}
}
p1=p1->next;
}
里面的循环一直走,就得不到答案(也不知道为什么明明while有对于j的判断会死循环…)…于是有了这样的代码:
大规模数据的点过不了,因为是双层循环。
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void createList(LinkList &L)
{
L=new LNode;
L->next=NULL;
LinkList p,s=L;//s是扫描指针
int n;
while(cin>>n&&n!=-1)
{
p=new LNode;
p->data=n;
p->next=NULL;
s->next=p;
s=p;
}
}
void Union(LinkList &s1,LinkList &s2,LinkList &s3)
{
s3=new LNode;
s3->next=NULL;
LinkList i=s1->next;
LinkList j=s2->next;
LinkList k=s3;
while(i)
{
j=s2->next;
int flag=1;
while((i->data!=j->data)&&j)
{
j=j->next;
//血的教训!如果没有这个if会死循环
if(j==NULL){
flag=0;
break;
}
}
if(flag==1){
LinkList p=new LNode;
p->data=i->data;
p->next=NULL;
k->next=p;
k=p;
}
i=i->next;
}
}
int main()
{
LinkList s1,s2,s3;
createList(s1);
createList(s2);
Union(s1,s2,s3);
LinkList p=s3->next;
if(p==NULL)
{
cout<<"NULL";
return 0;
}
else{
while(p)
{
if(p->next!=NULL){
cout<<p->data<<" ";
}
else{
cout<<p->data;
}
p=p->next;
}
}
return 0;
}
AC代码:
用两个指针比较。是对着不愿意透露姓名的W同学的代码抄的,感谢他!
#include<bits/stdc++.h>
using namespace std;
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*Linklist;
void Create_List(Linklist &L){
L = new Lnode;
L->next=NULL;
Linklist p;
Linklist r=L;
int x;
while(cin>>x){
if(x==-1) break;
else{
p=new Lnode;
p->data=x;
p->next=NULL;
r->next=p;
r=p;
}
}
}
void function1(Linklist &s1,Linklist &s2,Linklist &s3){
s3= new Lnode;
s3->next=NULL;
Linklist i=s1->next;
Linklist j=s2->next;
Linklist k=s3;
while(i&&j){
if(i->data>j->data){
j=j->next;
}
else if(i->data<j->data){
i=i->next;
}
else{
Linklist p=new Lnode;
p->next=NULL;
p->data=i->data;
k->next=p;
k=p;
i=i->next;
j=j->next;
}
}
}
int main(){
Linklist s1,s2,s3;
Create_List(s1);
Create_List(s2);
function1(s1,s2,s3);
Linklist p=s3->next;
if(p==NULL){
cout<<"NULL"<<endl;
}
else{
int flag=0;
while(p){
if(flag) cout<<" ";
cout<<p->data;
p=p->next;
flag++;
}
}
}