zoukankan      html  css  js  c++  java
  • 数据结构算法C语言实现(十七)--- 5.1&5.2数组:定义、顺序表示及实现

      一.简述

      理解数组位置的计算公式

        LOC(j1, j2, ···, jn) = LOC(0, 0, ..., 0) + (bx ··· x bx j1 + bx ··· x bx j2 + ··· + bx jn-1 + jn)L

      化简为           

         

      可以缩写成

        

      其中 cn = L,ci-1 = bi x ci, 1<i≤n。

      二.头文件

      1 //5_2.h
      2 /**
      3 author:zhaoyu
      4 date:2016-6-15
      5 */
      6 //----数组的顺序存储表示----
      7 #include "head.h"
      8 #include <stdarg.h>//表准头文件,提供宏va_start,va_arg和va_end
      9 #define MAX_ARRAY_DIM 8//用于存取变长参数表
     10 #define ElemType int
     11 typedef struct {
     12     ElemType *base;//数组元素基址,由InitArray分配
     13     int dim;//数组维数
     14     int *bounds;//数组维界基址,有InitArray分配
     15     int *constants;//数组映像函数常量基址,由InitArray分配
     16 }Array;
     17 void test(int x1, ...)
     18 {//测试 stdarg
     19     va_list ap;
     20     va_start(ap, x1);
     21     for (int i = 0; i < x1; i++)
     22     {
     23         printf("%d	", va_arg(ap, int));
     24     }
     25     printf("
    ");
     26 }
     27 
     28 //----基本操作的算法描述----
     29 Status InitArray(Array &A, int dim, ...)
     30 {//若位数 dim 和各维度长度合法,则构造相应的数组A,并返回 OK
     31     if (dim < 1 || dim > MAX_ARRAY_DIM)
     32     {
     33         return ERROR;
     34     }
     35     A.dim = dim;
     36     A.bounds = (int *)malloc(dim * sizeof(int));
     37     if (!A.bounds)
     38     {
     39         exit(OVERFLOW);
     40     }
     41     //各维度长度合法,则存入A.bounds,并求出A的元素总数elemtotal
     42     int elemtotal  = 1;
     43     va_list ap;
     44     va_start(ap, dim);//ap 为 va_list 类型,是存放变长参数表信息的数组
     45     for (int i = 0; i < dim; i++)
     46     {
     47         A.bounds[i] = va_arg(ap, int);
     48         if (A.bounds[i] < 0)
     49         {
     50             return ERROR;
     51         }
     52         elemtotal *= A.bounds[i];
     53     }
     54     va_end(ap);
     55     A.base = (ElemType *)malloc(elemtotal * sizeof(ElemType));
     56     if (!A.base)
     57     {
     58         exit(OVERFLOW);
     59     }
     60     //求映像函数的常数 Ci,存入 A.constant[i-1], i = 1,...,dim
     61     A.constants = (int *)malloc(dim * sizeof(int));
     62     A.constants[dim-1] = 1;//L=1
     63     for (int i = dim-2; i >= 0; --i)
     64     {
     65         A.constants[i] = A.bounds[i+1] * A.constants[i+1];
     66     }
     67     return OK;
     68 }
     69 Status DestroyArray(Array &A)
     70 {//销毁数组 A
     71     if (!A.base)
     72     {
     73         return ERROR;
     74     }
     75     free(A.base);
     76     A.base = NULL;
     77     if (!A.bounds)
     78     {
     79         return ERROR;
     80     }
     81     free(A.bounds);
     82     A.bounds = NULL;    
     83     if (!A.constants)
     84     {
     85         return ERROR;
     86     }
     87     free(A.constants);
     88     A.constants = NULL;
     89     return OK;
     90 }
     91 Status Locate(Array A, va_list ap, int &off)
     92 {//若 ap 指示的各下标之合法, 则求出该元素在 A 的相对地址 off
     93     off = 0;
     94     for (int i = 0; i < A.dim; ++i)
     95     {
     96         int index = va_arg(ap, int);
     97         if (index < 0 || index > A.bounds[i])
     98         {
     99             return OVERFLOW;
    100         }
    101         off += A.constants[i]*index;
    102     }
    103     return OK;
    104 }
    105 Status Value(Array A, ElemType &e, ...)
    106 {// A 是 n 维数组,e 为元素变量,随后是 n 个下标值
    107 //若各下标不越界,则 e 赋值为所指定的 A 的元素值, 并返回 OK
    108     va_list ap;
    109     va_start(ap, e);
    110     int result = 0, off;
    111     if ((result = Locate(A, ap, off))<=0)
    112     {
    113         return result;
    114     }
    115     e = *(A.base + off);
    116     return OK;
    117 }
    118 Status Assign(Array &A, ElemType e, ...)
    119 {// A 是 n 维数组,e 为元素变量,随后是 n 个下标值
    120 //若各下标不越界,则 e 赋给所指定的 A 的元素, 并返回 OK
    121     va_list ap;
    122     va_start(ap, e);
    123     int result, off;
    124     if ((result = Locate(A, ap, off)) <= 0)
    125     {
    126         return result;
    127     }
    128     *(A.base + off) = e;
    129     return OK;
    130 }
    5_2.h

      三.CPP文件

     1 //5_2.cpp
     2 /**
     3 author:zhaoyu
     4 date:2016-6-15
     5 */
     6 #include "5_2.h"
     7 int main(int argc, char const *argv[])
     8 {
     9     test(3, 1, 2, 3);
    10     Array A;
    11     InitArray(A, 3, 4, 2, 2);
    12     for (int i = 0; i < 4; ++i)
    13     {
    14         for (int j = 0; j < 2; ++j)
    15         {
    16             for (int k = 0; k < 2; ++k)
    17             {
    18                 Assign(A, 100*i+j*10+k, i, j, k);
    19             }
    20         }
    21     }
    22     for (int i = 0; i < 4; ++i)
    23     {
    24         printf("
    ");
    25         for (int j = 0; j < 2; ++j)
    26         {
    27             for (int k = 0; k < 2; ++k)
    28             {
    29                 int e;
    30                 Value(A, e, i, j, k);
    31                 printf("%d-%d-%d	%d
    ", i, j, k, e);
    32             }
    33         }
    34     }    
    35     return 0;
    36 }
    5_2.cpp

      四.测试

      

  • 相关阅读:
    PHP install perl module
    PHP 静态页
    PHP对类的操作
    PHP Mysql操作。
    2020.7.16
    2020.7.19
    2020.7.14
    2020.7.12
    2020.7.17
    2020.7.10
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5575638.html
Copyright © 2011-2022 走看看