三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 372|回复: 0
打印 上一主题 下一主题

C语言数据结构-bo5-1.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 08:45:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* bo5-1.c 顺序存储数组(存储结构由c5-1.h定义)的基本操作(5个) */
  2. Status InitArray(Array *A,int dim,...)
  3. { /* 若维数dim和各维长度合法,则构造相应的数组A,并返回OK */
  4.    int elemtotal=1,i; /* elemtotal是元素总值 */
  5.    va_list ap;
  6.    if(dim<1||dim>MAX_ARRAY_DIM)
  7.      return ERROR;
  8.    (*A).dim=dim;
  9.    (*A).bounds=(int *)malloc(dim*sizeof(int));
  10.    if(!(*A).bounds)
  11.      exit(OVERFLOW);
  12.    va_start(ap,dim);
  13.    for(i=0;i<dim;++i)
  14.    {
  15.      (*A).bounds[i]=va_arg(ap,int);
  16.      if((*A).bounds[i]<0)
  17.        return UNDERFLOW; /* 在math.h中定义为4 */
  18.      elemtotal*=(*A).bounds[i];
  19.    }
  20.    va_end(ap);
  21.    (*A).base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
  22.    if(!(*A).base)
  23.      exit(OVERFLOW);
  24.    (*A).constants=(int *)malloc(dim*sizeof(int));
  25.    if(!(*A).constants)
  26.      exit(OVERFLOW);
  27.    (*A).constants[dim-1]=1;
  28.    for(i=dim-2;i>=0;--i)
  29.      (*A).constants[i]=(*A).bounds[i+1]*(*A).constants[i+1];
  30.    return OK;
  31. }

  32. Status DestroyArray(Array *A)
  33. { /* 销毁数组A */
  34.    if((*A).base)
  35.    {
  36.      free((*A).base);
  37.      (*A).base=NULL;
  38.    }
  39.    else
  40.      return ERROR;
  41.    if((*A).bounds)
  42.    {
  43.      free((*A).bounds);
  44.      (*A).bounds=NULL;
  45.    }
  46.    else
  47.      return ERROR;
  48.    if((*A).constants)
  49.    {
  50.      free((*A).constants);
  51.      (*A).constants=NULL;
  52.    }
  53.    else
  54.      return ERROR;
  55.    return OK;
  56. }

  57. Status Locate(Array A,va_list ap,int *off) /* Value()、Assign()调用此函数 */
  58. { /* 若ap指示的各下标值合法,则求出该元素在A中的相对地址off */
  59.    int i,ind;
  60.    *off=0;
  61.    for(i=0;i<A.dim;i++)
  62.    {
  63.      ind=va_arg(ap,int);
  64.      if(ind<0||ind>=A.bounds[i])
  65.        return OVERFLOW;
  66.      *off+=A.constants[i]*ind;
  67.    }
  68.    return OK;
  69. }

  70. Status Value(ElemType *e,Array A,...) /* 在VC++中,...之前的形参不能是引用类型 */
  71. { /* ...依次为各维的下标值,若各下标合法,则e被赋值为A的相应的元素值 */
  72.    va_list ap;
  73.    Status result;
  74.    int off;
  75.    va_start(ap,A);
  76.    if((result=Locate(A,ap,&off))==OVERFLOW) /* 调用Locate() */
  77.      return result;
  78.    *e=*(A.base+off);
  79.    return OK;
  80. }

  81. Status Assign(Array *A,ElemType e,...)
  82. { /* ...依次为各维的下标值,若各下标合法,则将e的值赋给A的指定的元素 */
  83.    va_list ap;
  84.    Status result;
  85.    int off;
  86.    va_start(ap,e);
  87.    if((result=Locate(*A,ap,&off))==OVERFLOW) /* 调用Locate() */
  88.      return result;
  89.    *((*A).base+off)=e;
  90.    return OK;
  91. }
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-12-8 00:50 , Processed in 0.028025 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表