PAT 1097 用例四-段错误

问题

测试用例的数据中出现了问题,导致输入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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值