第二章:线性表与realloc用法 学习记录

数据结构 专栏收录该内容
2 篇文章 0 订阅

现在学到第二章线性表的第二节了,在这里有两点需要特别引起注意.

1.在高老师的线性表基本操作中,对于函数的指针调用时没有用*号,其原代码如下:

int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ // 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
  // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
  //           若这样的数据元素不存在,则返回值为0。算法2.6
  int i=1; // i的初值为第1个元素的位序
  ElemType *p=L.elem; // p的初值为第1个元素的存储位置
  while(i<=L.length&&!compare(*p++,e)) // i未超出表的范围且未找到满足关系的数据元素
    ++i; // 继续向后找
  if(i<=L.length) // 找到满足关系的数据元素
    return i; // 返回其位序
  else // 未找到满足关系的数据元素
    return 0;
}

其中compare(*p++,e)应该写成(*compare(*p++,e)),当然高老师这里方法也可以通过编译,但是不规范的写法,我在微软网站找到这么一遍关于函数指针调用的说明,如下:

             函数指针用法

 

2.有关realloc函数的使用说明

在算法2.1的线性表合并,在其Status ListInsert(SqList &L,int i,ElemType e)用到了realloc函数,她这里用得很好,注意到了realloc万一没有分配成功的话,也不会丢失原来指针地址,摘录如下:

if(L.length==L.listsize) // 当前存储空间已满,增加分配,修改
  { newbase=(ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
    if(!newbase) // 存储分配失败
      exit(OVERFLOW);
    L.elem=newbase; // 新基址赋给L.elem
    L.listsize+=LIST_INCREMENT; // 增加存储容量
  }

 

另外个人对realloc函数说明一下,也是我查询了相关资料做个人总结:

1.如果realloc分配地址时,原来地址后有空的存储空间,则realloc分配返回地址原来地址不变;

2.如果realloc分配地址时,原来地址后没有空存储空间,而内存块还有空地址,则返回新的指针地址,并把原来空间的数据复制过来,并释放原来空间;

3.如果realloc分配地址时,内存块没有这么多空间,则返回NULL,即分配不成功,而原来地址保持不变。

这是我个人总结,如有问题,请大家指点。

  • 3
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值