首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

此内存不能为written是咋回事

2012-08-11 
此内存不能为written是怎么回事?题目:某数列为空。给出在该数列中添加、删除元素以及询问第k小元素上线率的

此内存不能为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, 反正是访问越界了。

热点排行