pat 乙级 1025 反转链表
目前无法ac过最后一个测试点,其余ac,原因是有无效节点存在,但这个代码加上去除无效节点函数时便会运行超时
还没想出来怎么做,先这样吧
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> typedef struct node { char add[6]; int data; char next[6]; } pnode; typedef struct head { char add[6]; int k; int m; } phead; int main() { int i = 0; int first = 0; int j = 0; phead q; scanf("%s %d %d", &q.add, &q.k, &q.m); pnode l[q.k]; for (i = 0; i < q.k; i++) { scanf("%s %d %s", &l[i].add, &l[i].data, &l[i].next); } pnode temp; // int flag=1; // int qk=q.k; // for(i=0;i<q.k-1;i++){ //去除无效节点 // flag=1; // for(j=i+1;j<q.k;j++){ // if(l[i].add==l[j].next||l[i].next==l[j].add){ // flag=0;break; // } // } // if(flag==1){ // for(int r=i;r<q.k-1;r++){ // strcpy(l[r].add,l[r+1].add); // l[r].data=l[r+1].data; // strcpy(l[r].next,l[r+1].add); // } // i=i-1; // qk--; // } // } // q.k=qk; while (1) // 确定首字节位置 { if (strcmp(l[first].add, q.add) != 0) { first++; } else { break; } } temp = l[0]; l[0] = l[first]; l[first] = temp; for (i = 0; i < q.k - 1; i++) // 按123456等排序 { for (j = i + 1; j < q.k; j++) { if (strcmp(l[i].next, l[j].add) == 0) { temp = l[j]; l[j] = l[i + 1]; l[i + 1] = temp; break; } } } if (q.m == 1) { for (i = 0; i < q.k; i++) { printf("%s %d %s\n", l[i].add, l[i].data, l[i].next); } return 0; } pnode tail; strcpy(tail.next, l[q.k - 1].next); for (j = q.k / q.m; j > 0; j--) { for (i = (j) * (q.m) - 1; i > (j - 1) * q.m; i--) { strcpy(l[i].next, l[i - 1].add); } } int p = 0; for (j = 0; j < q.k / q.m; j++) { p = 0; for (i = j * q.m; p < q.m / 2; i++) { temp = l[i]; l[i] = l[(j + 1) * q.m - p - 1]; l[(j + 1) * q.m - p - 1] = temp; p++; } } for (i = q.m - 1; i < q.k-1; i = i + q.m) { strcpy(l[i].next, l[i + 1].add); } strcpy(l[q.k - 1].next, tail.next); for (i = 0; i < q.k; i++) { printf("%s %d %s\n", l[i].add, l[i].data, l[i].next); } return 0; }

浙公网安备 33010602011771号