为什么会re呢
查看原帖
为什么会re呢
486570
Q9_KKK楼主2022/4/9 00:08

我的代码不是有亿点点长。。。

#include <stdio.h>
#include <stdlib.h>

#define maxn (int)1e9 + 5
#define MAXN (int)1e6 + 5

typedef struct data
{
    struct data *lnode;
    struct data *rnode;
    struct data *parent;
    struct data *next;
    int data;
} NODE, *LINK;

int cnt_total = 0;
int cnt_left = 0;

#define max(a, b) (a) > (b) ? (a) : (b)
#define min(a, b) (a) < (b) ? (a) : (b)

int set1(LINK q, int b);
int set2(LINK q, int b);
int set3(LINK q, int b);
int set4(LINK q, int b);
void set5(LINK q, int b);
void deleteself(LINK q);

int main()
{
    int n;
    scanf("%d", &n);
    LINK head = (LINK)malloc(sizeof(NODE));
    head->lnode = NULL;
    head->rnode = NULL;
    head->parent = NULL;
    int a, b;
    scanf("%d%d", &a, &b);
    head->data = b;
    cnt_total++;
    while (--n)
    {
        scanf("%d%d", &a, &b);
        LINK q = head;
        if (a == 5)
        {
            cnt_total++;
            if (b < q->data)
                cnt_left++;
            set5(q, b);
        }
        else if (a == 1)
            printf("%d\n", set1(q, b));
        else if (a == 2)
            printf("%d\n", set2(q, b));
        else if (a == 3)
            printf("%d\n", set3(q, b));
        else if (a == 4)
            printf("%d\n", set4(q, b));
    }
    deleteself(head);
    return 0;
};

void set5(LINK q, int b)
{
    if (b < q->data && q->lnode == NULL)
    {
        LINK p = (LINK)malloc(sizeof(NODE));
        p->data = b;
        p->lnode = NULL;
        p->rnode = NULL;
        p->parent = q;
        q->lnode = p;
        return;
    }
    else if (b >= q->data && q->rnode == NULL)
    {
        LINK p = (LINK)malloc(sizeof(NODE));
        p->data = b;
        p->lnode = NULL;
        p->rnode = NULL;
        p->parent = q;
        q->rnode = p;
        return;
    }
    else
    {
        if (b < q->data)
            set5(q->lnode, b);
        else
            set5(q->rnode, b);
    }
}
int set1(LINK q, int b)
{
    LINK head;
    LINK tail;
    int pos;
    if (q->data >= b)
    {
        pos = 1;
        while (q->lnode)
            q = q->lnode;
        head = q;
        tail = q;
        while (head->data != b)
        {
            tail->next = head->parent;
            tail = tail->next;
            if (head->parent->rnode != head && head->parent->rnode)
            {
                tail->next = head->parent->rnode;
                tail = tail->next;
            }
            head = head->next;
            pos++;
        }
    }
    else
    {
        pos = cnt_total;
        while (q->rnode)
            q = q->rnode;
        head = q;
        tail = q;
        while (head->data != b)
        {
            tail->next = head->parent;
            tail = tail->next;
            if (head->parent->lnode != head && head->parent->lnode)
            {
                tail->next = head->parent->lnode;
                tail = tail->next;
            }
            head = head->next;
            pos--;
        }
    }
    return pos;
}

int set2(LINK q, int b)
{
    LINK head;
    LINK tail;
    int pos;
    if (b < cnt_left)
    {
        pos = 1;
        while (q->lnode)
            q = q->lnode;
        head = q;
        tail = q;
        while (pos != b)
        {
            tail->next = head->parent;
            tail = tail->next;
            if (head->parent->rnode != head && head->parent->rnode)
            {
                tail->next = head->parent->rnode;
                tail = tail->next;
            }
            head = head->next;
            pos++;
        }
    }
    else
    {
        pos = cnt_total;
        while (q->rnode)
            q = q->rnode;
        head = q;
        tail = q;
        while (pos != b)
        {
            tail->next = head->parent;
            tail = tail->next;
            if (head->parent->lnode != head && head->parent->lnode)
            {
                tail->next = head->parent->lnode;
                tail = tail->next;
            }
            head = head->next;
            pos--;
        }
    }
    return head->data;
}

int set3(LINK q, int b) //找前驱
{
    LINK p = q;
    while (p->lnode)
        p = p->lnode;
    if (b == p->data)
        return -2147483647;
    while (q->data != b)
    {
        if (q->data > b)
            q = q->lnode;
        else
            q = q->rnode;
    }
    int t1 = -2147483647;
    int t2 = -2147483647;
    if (q->lnode)
        t1 = q->lnode->data;
    if (q->parent->lnode != q)
        t2 = q->parent->data;
    return max(t1, t2);
}
int set4(LINK q, int b) //找后继
{
    LINK p = q;
    while (p->rnode)
        p = p->rnode;
    if (b == p->data)
        return 2147483647;
    while (q->data != b)
    {
        if (q->data > b)
            q = q->lnode;
        else
            q = q->rnode;
    }
    int t1 = 2147483647;
    int t2 = 2147483647;
    if (q->rnode)
        t1 = q->rnode->data;
    if (q->parent->rnode != q)
        t2 = q->parent->data;
    return min(t1, t2);
}

void deleteself(LINK q)
{
    if (q->lnode == NULL && q->rnode == NULL)
    {
        free(q);
    }
    else
    {
        if (q->lnode)
        {
            deleteself(q->lnode);
            q->lnode = NULL;
        }
        if (q->rnode)
        {
            deleteself(q->rnode);
            q->rnode = NULL;
        }
    }
}

这段代码改了很久,题目数据测了没问题 然后我又自己编了一些满二叉的数据测了一下,也没啥问题 因为题目没给测试数据,所以想问下到底是哪里出现了访问空指针呢?(盲猜空指针)

2022/4/9 00:08
加载中...