罗马尼亚硬拉 2021-10-08 15:37 采纳率: 100%
浏览 76
已结题

链表去重 第五个测试点过不去 朋友们看看代码没有考虑到哪点

img

网上的正确代码


#include <stdio.h>
#include <math.h>

typedef struct Node
{
    int date;
    int next;
} Node;

int first[100005]; // 存放第一条链表的地址
int f = 0;
;
int isVisited[100005]; // 判断是否有重复,0代表未重复,1代表已存在
int is = 0;
int last[100005]; // 存放第二条链表的地址
int l = 0;

void print(Node arr[], int g[], int n);

int main()
{
    Node arr[100005];
    int head; // 首地址
    int n;
    int ads;
    scanf("%d %d", &head, &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &ads);
        scanf("%d %d", &arr[ads].date, &arr[ads].next);
    }
    int p = head;
    while (p != -1)
    {
        is = abs(arr[p].date); // 取出键值的绝对值
        // 判断该键值是否存在
        if (!isVisited[is])
        {
            // 该键值不存在
            first[f++] = p;    // 将该键值的地址放入第一条链表中
            isVisited[is] = 1; // 将该键值位置置为1,表示已存在
        }
        else
        {
            // 该键值存在
            last[l++] = p; // 将该键值地址放入第二条链表中
        }
        p = arr[p].next; // 移向下一位置
    }
    print(arr, first, f);
    print(arr, last, l);
    return 0;
}
void print(Node arr[], int g[], int n)
{
    for (int i = 0; i < n; i++)
    {
        if (i == n - 1)
        {
            printf("%05d %d -1\n", g[i], arr[g[i]].date);
        }
        else
        {
            printf("%05d %d %05d\n", g[i], arr[g[i]].date, g[i + 1]);
        }
    }
}

我的代码

#include <stdio.h>
#include <math.h>
struct node
{
    int add;
    int data;
    int next;
} l1[100000], l2[100000], l3[100000], l4[100000];
int judge[10000], first, n, a, b;
void cunshuju()
{
    scanf("%d %d", &first, &n);
    int i;
    for (i = 0; i < n; i++)
    {
        int add, data, next;
        scanf("%d %d %d", &add, &data, &next);
        l1[add].add = add;
        l1[add].data = data;
        l1[add].next = next;
        /* if (next == -1)
            break; */
    }
    int index = first;
    i = 0;
    while (index != -1)
    {
        l2[i++] = l1[index];
        index = l1[index].next;
        if (l1[index].add == -2)
            break;
    }
    n = i;
    /* printf("n = %d\n", n); */
}
void quchong()
{
    int i;
    a = 0;
    b = 0;
    for (i = 0; i < n; i++)
    {
        if (!judge[abs(l2[i].data)])
        {
            l3[a++] = l2[i];
            judge[abs(l2[i].data)] = 1;
        }
        else
            l4[b++] = l2[i];
    }
}
void shuchu()
{
    int i;
    for (i = 0; i < a; i++)
    {
        if (i != a - 1)
            printf("%05d %d %05d\n", l3[i].add, l3[i].data, l3[i + 1].add);
        else
            printf("%05d %d -1\n", l3[i].add, l3[i].data);
    }
    for (i = 0; i < b; i++)
    {
        if (i != b - 1)
            printf("%05d %d %05d\n", l4[i].add, l4[i].data, l4[i + 1].add);
        else
            printf("%05d %d -1", l4[i].add, l4[i].data);
    }
}
void l1chushihua()
{
    int i;
    for (i = 0; i < 100000; i++)
    {
        l1[i].add = -2;
        l1[i].data = -2;
        l1[i].next = -2;
    }
}
int main()
{
    l1chushihua();
    cunshuju();
    quchong();
    shuchu();
    return 0;
}
  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2021-10-08 17:16
    关注

    题目中说明键值不超过10的4次方,那说明键值是可以等于10000的。所以你judge数组大小有问题,因为你写了judge[abs(l2[i].data)] = 1;当data为10000时,judge会下标越界。测试点估计都是写边界值测试,考虑增大一下judge的容量试试吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月16日
  • 已采纳回答 10月8日
  • 创建了问题 10月8日

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类