此内存不能为written是怎么回事?
题目:
某数列为空。
给出在该数列中添加、删除元素以及询问第k小元素上线率的操作,请你编写一个程序回答所有询问。
输入m个操作,共m行,每行两个正整数,表示操作序号op和操作对象x
如果op=1,表示增加了一个大小为x的元素
如果op=2,表示询问当前第x小的元素的大小
如果op=3,表示删除了一个大小为x的元素。
对于每个询问,输出一行答案,如果不存在,输出0。
小数据不超过1M 占50%
大数据不超过10M 占50%
另外,对于50%的数据,没有删除操作
我编写的程序在编译时显示0错误,0警告,但若输入一个元素比已有大的元素,就会出现“此内存不能为written”
的错误信息
代码如下:
#include<stdio.h>
typedef struct N
{
struct N *nex;
int on;
int sum;
}num;
num fri[1000000];
num *head;
int askc[1000000];
void read(int *a)
{
char x;
for (x=getchar();x<48||x>57;x=getchar());
for ((*a)=0;x>47&&x<58;x=getchar())
(*a)=(*a)*10+x-48;
}
int pr(int k)
{
num *p;
p=head;
for(;k>(p->nex->on);p=(p->nex));
return p-fri;
}
int add(int next,int k,int *j,int *lp)
{
int i;
if(next==0)
{
fri[0].on=k;
fri[0].sum=1;
fri[0].nex=NULL;
head=fri;
return 1;
}
else if(k<head->on)
{
fri[next].on=k;
fri[next].sum=1;
fri[next].nex=head;
head=&fri[next];
return next+1;
}
else if(k==head->on)
{
head->sum+=1;
return next;
}
else if(fri[*j].on<k)
{
fri[next].on=k;
fri[next].sum=1;
fri[next].nex=NULL;
fri[*j].nex=&fri[next];
(*lp)=(*j);
(*j)=next;
return next+1;
}
i=pr(k);
if(k==fri[i].nex->on)
fri[i].sum+=1;
else
{
fri[next].on=k;
fri[next].sum=1;
fri[next].nex=fri[i].nex;
fri[i].nex=&fri[next];
next++;
}
return next;
}
int ask(int val,int k)
{
num *p=head;
int mum=0;
if(k<=val)
{
for(;mum<k;mum+=(p->sum),p=p->nex);
return p->on;
}
else
return 0;
}
void del(int next,int k,int *p,int *lp)
{
int i;
if(k==fri[*p].on)
{
if(fri[*p].sum!=1)
fri[*p].sum=fri[*p].sum-1;
else
{
*p=*lp;
fri[*lp].nex=NULL;
}
return;
}
i=pr(k);
if(fri[i].sum!=1)
(fri[i].nex->sum)--;
else
fri[i].nex=fri[i].nex->nex;
return;
}
int main()
{
int n,i,j=0,m=0,ord,k,val=0;
int *p,*lp;
(*p)=0;
scanf("%d",&n);
for(i=0;i<1000000;i++)
fri[i].sum=0;
for(i=0;i<n;i++)
{
read(&ord);
read(&k);
if(ord==1)
{
j=add(j,k,p,lp);
val++;
}
else if(ord==2)
{
askc[m]=ask(val,k);
m++;
}
else if(ord==3)
{
del(j,k,p,lp);
val--;
}
}
for(i=0;i<m;i++)
printf("%d\n",askc[i]);
getch();
return 0;
}
请各位帮忙寻找程序中的错误之处和该报错的原因
在此先行谢过!
[解决办法]
- C/C++ code
int *p,*lp; (*p)=0;//错误,指针没有分配内存就使用了
[解决办法]
白底黑字,看不实在。
内存不能为written, 反正是访问越界了。