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;
}

 

posted @ 2023-03-04 02:04  雨中白发人  阅读(29)  评论(0)    收藏  举报