问题
测试用例的数据中出现了问题,导致输入n个节点,但是实际的节点数不足n;
AC代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
struct nodes{
int addr;
int key;
int nextAddr;
}res[100001];
vector<nodes> sortres;
vector<nodes> list1;
vector<nodes> list2;
int flag[10001]={0};
int st, N;
int node, val, tt;
int main(){
cin>>st>>N;
if(N==1){
string i,j,k;
cin>>i>>j>>k;
cout<<i<<" "<<j<<" "<<k<<endl;
return 0;
}
for(int i=0;i<N;i++){
cin>>node>>val>>tt;
res[node].addr=node;
res[node].key=val;
res[node].nextAddr=tt;
}
int start=st;
while(start!=-1){
sortres.push_back(res[start]);
start = res[start].nextAddr;
}
int i=0;
while(i<sortres.size()){
if(!flag[abs(sortres[i].key)]){
flag[abs(sortres[i].key)]=1;
list1.push_back(sortres[i]);
}else{
list2.push_back(sortres[i]);
}
i++;
}
for(int i=0;i<list1.size();i++){
printf("%05d %d ", list1[i].addr, list1[i].key);
if(i+1!=list1.size())printf("%05d\n", list1[i+1].addr);
else{
cout<<-1<<endl;
}
}
for(int i=0;i<list2.size();i++){
printf("%05d %d ", list2[i].addr, list2[i].key);
if(i+1!=list2.size())printf("%05d\n", list2[i+1].addr);
else{
cout<<-1<<endl;
}
}
return 0;
}
分析问题(代码)
对比写法:处理节点部分
(段错误)
for(int i=0;i<N;i++){
if(!flag[abs(sortList[i].key)]){
flag[abs(sortList[i].key)]=1;
list1.push_back(sortList[i]);
}else{
list2.push_back(sortList[i]);
}
}
(通过)
while(start!=-1){
if(!flag[abs(sortList[i].key)]){
flag[abs(sortList[i].key)]=1;
list1.push_back(sortList[i]);
}else{
list2.push_back(sortList[i]);
}
start = res[start].nextAddr;
}
分析问题(数据)
从AC代码和出现段错误代码来看,是for(int i=0;i<N;i++)这句话出现问题
i越界,但是在原题目中,明确了节点数是n,出现越界只有可能是数据坑。
进一步分析问题,可能导致节点“丢失”的原因:
如果出现类似于:
00010 12 02113
00010 15 03223
这样的数据,后者将会把前者覆盖,最后链表的节点数不足n