PAT1075-----链表元素分类 (25分)
1075 链表元素分类 (25分)
输入样例:
00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218
输出样例:
33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1
思路:
1.用数组下标表示链表的编号分别记录1.该节点的值2.该节点的后继结点
2.根据三个条件遍历三次链表构建新的链表
首次通过代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 void output(int a,int b,int c){ 3 int x=a; 4 for(int i=0;i<3;i++){ 5 if(i==1) printf("%d ",b); 6 else{ 7 if(i==2) x=c; 8 if(x>=0&&x<10) printf("0000"); 9 else if(x>=10&&x<100) printf("000"); 10 else if(x>=100&&x<1000) printf("00"); 11 else if(x>=1000&&x<10000) printf("0"); 12 printf("%d",x); 13 if(i==0) printf(" "); 14 } 15 } 16 } 17 int main(){ 18 int value[100050]; 19 int next[100050]; 20 int next1[100050]; 21 int begin,sum,k; 22 scanf("%d %d %d",&begin,&sum,&k); 23 for(int i=0;i<sum;i++){ 24 int a,b,c; 25 scanf("%d %d %d",&a,&b,&c); 26 value[a]=b; 27 next[a]=c; 28 } 29 int i=begin; 30 int i1,begin1; 31 int flag=1; 32 while(1){ 33 if(value[i]<0){ 34 if(flag){ 35 flag=0; 36 i1=i; 37 begin1=i; 38 } 39 else{ 40 next1[i1]=i;i1=i; 41 } 42 } 43 i=next[i]; 44 if(i==-1) break; 45 } 46 i=begin; 47 while(1){ 48 if(value[i]>=0&&value[i]<=k) { 49 if(flag){ 50 flag=0; 51 i1=i; 52 begin1=i; 53 } 54 else{ 55 next1[i1]=i;i1=i; 56 } 57 } 58 i=next[i]; 59 if(i==-1) break; 60 } 61 i=begin; 62 while(1){ 63 if(value[i]>k) { 64 if(flag){ 65 flag=0; 66 i1=i; 67 begin1=i; 68 } 69 else{ 70 next1[i1]=i;i1=i; 71 } 72 } 73 i=next[i]; 74 if(i==-1) break; 75 } 76 next1[i1]=-1; 77 i1=begin1; 78 while(1){ 79 output(i1,value[i1],next1[i1]); 80 if(next1[i1]!=-1) printf("\n"); 81 i1=next1[i1]; 82 if(i1==-1) break; 83 } 84 return 0; 85 }
卡主我的地方:output函数中输出x>=0&&x<10写成了x>=0&&x<9导致第五个测试点一直不能通过,用%05d输出也可行