浙大PAT乙级1075链表元素分类C语言 测试点5运行超时,请问如何优化

img


#include<stdio.h>
struct node{
    int address;
    int data;
    int next;
};
int main(){
    int i,sa,N,K,sub_s;
    scanf("%d %d %d\n",&sa,&N,&K);
    int neg_num[N],pos_num[N],overK[N];//记录符合范围的值的下标
    int len_n = 0;
    int len_p = 0;
    int len_o = 0;
    struct node num[N];
    for (i=0;i<N;i++)
    {
        scanf("%d %d %d\n",&num[i].address,&num[i].data,&num[i].next);
        if (num[i].address==sa)//找到第一个元素的下标
            sub_s = i;
    }
    while (num[sub_s].next!=-1)//没有到最末
    {
        if (num[sub_s].data<0)
            neg_num[len_n++] = sub_s;
        else if (num[sub_s].data>K)
            overK[len_o++] = sub_s;
        else
            pos_num[len_p++] = sub_s;
        for (i=0;i<N;i++)
        {
            if (num[i].address==num[sub_s].next)
            {
                sub_s = i;
                break;//找到了一定要跳出,不然sub_s在改变,重新寻找将对新的结点找下一个结点,是错误的
            }
        }
    }
     if (num[sub_s].data<0)//因为最后一个结点还没有运行就出来了,因此需要再补一次
        neg_num[len_n++] = sub_s;
     else if (num[sub_s].data>K)
        overK[len_o++] = sub_s;
     else
        pos_num[len_p++] = sub_s;
    for (i=0;i<len_n;i++)
    {
        if (i!=len_n-1)
            printf("%05d %d %05d\n",num[neg_num[i]].address,num[neg_num[i]].data,num[neg_num[i+1]].address);
        else
        {
            printf("%05d %d",num[neg_num[i]].address,num[neg_num[i]].data);
            if (len_p==0 && len_o==0)
                printf(" -1");
            else if (len_p!=0)
                printf(" %05d\n",num[pos_num[0]].address);
            else
                printf(" %05d\n",num[overK[0]].address);
        }
    }
    for (i=0;i<len_p;i++)
    {
        if (i!=len_p-1)
            printf("%05d %d %05d\n",num[pos_num[i]].address,num[pos_num[i]].data,num[pos_num[i+1]].address);
        else
        {
            printf("%05d %d",num[pos_num[i]].address,num[pos_num[i]].data);
            if (len_o==0)
                printf(" -1");
            else
                printf(" %05d\n",num[overK[0]].address);
        }
    }
    for (i=0;i<len_o;i++)
    {
         if (i!=len_o-1)
            printf("%05d %d %05d\n",num[overK[i]].address,num[overK[i]].data,num[overK[i+1]].address);
         else
            printf("%05d %d -1\n",num[overK[i]].address,num[overK[i]].data);
    }
    return 0;
}