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