云裳容 2017-03-21 10:49 采纳率: 0%
浏览 3862
已采纳

数据结构顺序表,存储空间已满,增加分配

   if(L.length>=L.listsize)      /* 当前存储空间已满,增加分配 */
   {
     newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
     if(!newbase)
       return Error;;              /* 存储分配失败 */
     L.elem=newbase;              /* 新基址 */
     L.listsize+=LISTINCREMENT;        /* 增加存储容量 */
   }

 上面这是正确的,怎么改成下面的就错了??
    if(L.length>=L.listsize)
    {
        newbase= new ElemType[L.listsize+LISTINCREMENT];
            if(!newbase)
                return Error;
            L.elem=newbase;
            L.listsize+=LISTINCREMENT;
    }

/*判断存储空间是否已满,增加储存容量*/
 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define Error 0

typedef int Status; 
typedef int Boolean;  
typedef int ElemType;

 #define LIST_INIT_SIZE 10    
 #define LISTINCREMENT 10   

typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
    char name[10];
}SqList;
/*创建结构体(Sqlist)*/


int Empty(SqList L)
{
    if(L.length==0)
        return TRUE;
    return FALSE;
}
/*创建子函数(子程序),这是用来判断顺序表是否为空*/


Status InitList(SqList &L)
{
    L.elem=new ElemType[LIST_INIT_SIZE];
    if(!L.elem)
        return Error;
    L.length=0;
    L.listsize=LIST_INIT_SIZE;

    return OK;
}
/*初始化顺序表,产生一个新的存储空间*/


Status ListInsert(SqList &L,int i,ElemType e)
{
    ElemType *newbase,*q,*p;

    if(i<1||i>L.length+1)
        return Error;
/*判断i值是否合法*/


    if(L.length>=L.listsize)
    {
        newbase= new ElemType[L.listsize+LISTINCREMENT];
            if(!newbase)
                return Error;
            L.elem=newbase;
            L.listsize+=LISTINCREMENT;
    }

/*判断存储空间是否已满,增加储存容量*/

    q=L.elem +i-1;
     for(p=L.elem+L.length-1;p>=q;--p)
     *(p+1)=*p;
   *q=e;               
   ++L.length;        
   return OK;
 //插入算法
}


Status ListDelete(SqList &L,int i,ElemType *e) 
 {      
   ElemType *p,*q;
   if(i<1||i>L.length)      
     return Error;
   if(Empty(L)) {printf("empty\n");return Error;}

   p=L.elem+i-1;        
   *e=*p;                 
   q=L.elem+L.length-1;   
   for(++p;p<=q;++p)        
     *(p-1)=*p;
   L.length--;            
   return OK;
   //删除算法
 }


void output(SqList L){
int i;
if (L.length==0)printf("error\n");
for(i=0;i<L.length;i++)
printf("%d " ,L.elem[i]);
printf("\n");

}



 main(){

int i;int x;
SqList L;
if(InitList(L)==Error)  {printf("ERRor\n"); return Error;}
  // if(Empty(L)) printf("empty\n");
ListInsert(L,1,90); 
for(i=2;i<20;i++)
ListInsert(L,1,i);
output(L);

 /*ListDelete(L,1,&x);
 printf("%d\n",x);
 output(L);*/

 }

  • 写回答

2条回答 默认 最新

  • myibu 2017-03-22 02:31
    关注
      1. 用newbase在内存堆区开辟空间后得到的是一个新地址,newbase的值(地址)与L.elem的值(地址)不相同
      2. 当执行L.elem=newbase;语句时,L.elem的地址是newbase的地址,与未执行该语句的L.elem地址是不一样的       
        3. 因此新的L.elem地址空间存储  的全是随机值,要先将未执行L.elem=newbase;语句的L.elem地址空间元素分别赋值给newbase
            修改如下:
    
     if(L.length>=L.listsize)
     {
            newbase= new ElemType[L.listsize+LISTINCREMENT];
            if(!newbase)
                return Error;
    
                            //加入下条语句即可正常执行
                        for (p=newbase,q=L.elem;q<=L.elem+L.length;p++,q++)
                 *p=*q;
    
            L.elem=newbase;
            L.listsize+=LISTINCREMENT;
    }
    /*判断存储空间是否已满,增加储存容量*/
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵