醉了,得了30分的代码,我到底哪里错了,该怎么验证
找到错误原因了,首先题意没搞懂,其实他的序号是不变的,按初始输入顺序,位置是可变的。
然后删除链表一个链表的节点时,不要再加上delete了,因为我刚开始delete的是L,这是指针的地址,删了之后,p=L指向同一个内存空间,当然p也不再是L了,跟着L改变,因为两人指向的是同一个地址。最后改变顺序的每个节点的坐标值都会改变。delete是用不到的,以后也还是少用。因为确实不怎么安全。算法笔记说好像不用delete也不会错。占用的内存空间也不大。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x1;
int y1;
int x2;
int y2;
node *next;
};
struct location
{
int x;
int y;
};
int main()
{
int n,m,a,b,c,d,flag=0;
location loc[10];
cin>>n>>m;
int i=0,j=n;
node *p,*pre,*head,*L;
head=new node;
head->next=NULL;
pre=head;
for(i=0;i<n;i++)
{
p=new node;
cin>>a>>b>>c>>d;
p->x1=a;
p->y1=b;
p->x2=c;
p->y2=d;
p->next=pre->next;
pre->next=p;
}
for(i=0;i<m;i++)
{
cin>>a>>b;
loc[i].x=a;
loc[i].y=b;
}
for(i=0;i<m;i++)
{
L=head->next;
pre=head;
j=n+1;
flag=0;
while(L!=NULL)
{
j--;
if(loc[i].x>=L->x1&&loc[i].x<=L->x2&&loc[i].y>=L->y1&&loc[i].y<=L->y2)
{
cout<<j<<endl;
flag=1;
pre->next=L->next;
p=L;
delete(L);
p->next=head->next;
head->next=p;
break;
}
else
{
pre=L;
L=L->next;
}
}
if(flag==0) cout<<"IGNORED"<<endl;
}
return 0;
}
我好像找到原因了。。。。。下面是改正后的
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x1;
int y1;
int x2;
int y2;
int num;
node *next;
};
struct location
{
int x;
int y;
};
int main()
{
int n,m,a,b,c,d,flag=0;
location loc[10];
cin>>n>>m;
int i=0;
node *p,*pre,*head,*L;
head=new node;
head->next=NULL;
pre=head;
for(i=0;i<n;i++)
{
p=new node;
cin>>a>>b>>c>>d;
p->x1=a;
p->y1=b;
p->x2=c;
p->y2=d;
p->num=i+1;
p->next=pre->next;
pre->next=p;
}
for(i=0;i<m;i++)
{
cin>>a>>b;
loc[i].x=a;
loc[i].y=b;
}
for(i=0;i<m;i++)
{
L=head->next;
pre=head;
flag=0;
while(L!=NULL)
{
if(loc[i].x>=L->x1&&loc[i].x<=L->x2&&loc[i].y>=L->y1&&loc[i].y<=L->y2)
{
cout<<L->num<<endl;
flag=1;
pre->next=L->next;
p=L;
p->next=head->next;
head->next=p;
break;
}
else
{
pre=L;//pre是L的前一个结点
L=L->next;
}
}
if(flag==0) cout<<"IGNORED"<<endl;
}
return 0;
}
用c++的list,用法写的好难用
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x1;
int y1;
int x2;
int y2;
int num;
};
struct location
{
int x;
int y;
};
int main()
{
int n,m,a,b,c,d,flag=0;
node p;
cin>>n>>m;
list<node> l;
location loc[10];
list<node>::iterator iter;
int i=0,j=n;
for(i=0;i<n;i++)
{
cin>>a>>b>>c>>d;
p.x1=a;
p.y1=b;
p.x2=c;
p.y2=d;
p.num=i+1;
l.push_front(p);
}
for(i=0;i<m;i++)
{
cin>>a>>b;
loc[i].x=a;
loc[i].y=b;
}
for(i=0;i<m;i++)
{
flag=0;
iter=l.begin();
while(iter!=l.end())
{
if(loc[i].x>=iter->x1&&loc[i].x<=iter->x2&&loc[i].y>=iter->y1&&loc[i].y<=iter->y2)
{
cout<<iter->num<<endl;
l.erase(iter);
l.push_front(*iter);
flag=1;
break;
}
else
{
iter++;
}
}
if(flag==0) cout<<"IGNORED"<<endl;
}
return 0;
}