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

      四.测试

      

  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5575638.html
Copyright © 2011-2022 走看看