zoukankan      html  css  js  c++  java
  • 数据结构5.1_数组的定义、顺序表示及实现

    数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构离散存储结构。所谓的连续存储结构其实就是数组

    数组的基本操作

      初始化InitArray、销毁数组DestroyArray、取值Value、赋值Assign;

    数组一旦被定义,它的维数和维界就不再改变。

    因此,除了结构的初始化和销毁之外,数组只有存取元素修改元素值的操作。

     

    一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。

    因此采用顺序存储结构表示数据就是自然的事了。

     

    存储单元事一维的结构,而数组是个多维的结构,则用一组连续存储单元存放数组的数据元素就有个次序约定问题。

    对于二维数组有两种存储方式:1)以列序为主序的存储方式;2)以行序为主序的存储方式;

    C语言中使用的是以行序为主序的存储方式;

     

    一旦确定了它的维数,各维的长度,便可为它分配存储空间。

    反之,只要给出一组下标便可求得相应数组元素的存储位置。

     

    ---------数组的顺序存储表示---------

    ---------基本操作的函数原型说明---------

    ---------基本操作的算法描述---------

     1 定义一个n维数组; 
     2 #include<stdarg.h> //解决不确定参数函数问题,标准头文件,提供va_start,va_arg,va_end
     3 //用于存储函数的变长参数,参数不确定的函数
     4 
     5 #define MAX_ARRAY_DIM 8    //数组维数的最大值
     6 
     7 typedef struct{
     8     ElemType    *base;  
     9     //数组元素基址,由InitArray分配
    10     
    11     int            dim;    
    12     //数组的维数,一维or二维
    13     
    14     int            * bounds;    
    15     //数组维界基址,由InitArray分配,存储各维的长度的数组
    16     
    17     int            * constants; 
    18     //数组映像函数常量基址,其实就是ci,确切说的是几个存储单元。
    19     
    20 }Array;
    21 
    22 Status InitArray(Array &A, int dim, ...)
    23 {
    24     if(dim<1||dim>MAX_ARRAY_DIM) return ERROR;
    25     A.dim = dim;
    26     A.bounds = ()malloc(dim*sizeof());
    27     if(!A.bounds) exit(OVERFLOW);
    28     
    29     //若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
    30     elemtotal =1;
    31     va_start(ap,dim);  
    32     for(i=0; i<dim; ++i)
    33     {
    34         A.bounds[i]=va_arg(ap,int);   //取出各维的长度
    35         if(A.bounds[i]<0) return UNDERFLOW;
    36         elemtotal *= A.bounds[i];
    37     }
    38     va_end(ap);
    39     //以上步骤求整个n维数组的元素个数;
    40     
    41     A.base = (ElemType *)malloc(elemtotal*sizeof(ElemType));
    42     if(!A.base) exit(OVERFLOW);
    43     
    44     A.constants = (int *)malloc(dim *sizeof(int));
    45     if(!A.constants) exit(OVERFLOW);
    46     
    47     A.constants[dim-1]=1;  //存储单元大小为L,0为基,这里指的是cn=L,
    48     for(i=dim-2; i>=0; --i) //减序
    49     {
    50         A.constants[i]=A.bounds[i+1]*A.constants[i+1];
    51     }
    52     return OK;
    53 }
    54 
    55 Status DestroyArray(Array &A){ //销毁数组
    56     if(!A.base) return ERROR;
    57     free(A.base); A.base=NULL;  //防止野指针
    58     if(A.bounds) return ERROR;
    59     free(A.bounds); A.bounds=NULL;
    60     if(A.constants) return ERROR;
    61     free(A.constants); A.constants=NULL;
    62 }
    63 
    64 //定位某个位置合法与否,且返回相对地址off
    65 Status Locate(Array A, va_list ap, int &off)
    66 {
    67     off=0;
    68     for(i=0;i<A.dim;++i)
    69     {
    70         ind = va_arg(ap,int);
    71         if(ind<0||ind>=A.bounds[i]) return OVERFLOW;
    72         off += A.constants[i] * ind;  //其实就是ci*ji 级数
    73     }
    74     return OK
    75     
    76 }
    77 
    78 //从某个位置取值
    79 Status Value(Array A, ElemType &e, ...){
    80     //A是n维数组,e为元素变量,随后是n个下标值
    81     //若各下标不超界,则e赋值为所指定位置的A的元素值,并返回OK
    82     va_start(ap,e);
    83     if((result=Locate(A,ap,off))<=0) return result;
    84     e = *(A.base+off);
    85     return OK;
    86     
    87 }
    88 
    89 //给某个位置赋值
    90 Status Assign(Array A, ElemType e, ...){
    91     //A是n维数组,e为元素变量,随后是n个下标值
    92     //若下标不超界,则将e的值赋给指定的A的元素,并返回OK
    93     va_start(ap,e);
    94     if((result=Locate(A,ap,off))<=0) return result;
    95     *(A.base+off)=e;
    96     return OK;
    97 }

    相关链接:

    数据结构之数组定义及基本操作:https://www.cnblogs.com/WuNaiHuaLuo/p/4826512.html

     

  • 相关阅读:
    Mybatis和Spring整合也是能用BatchExecutor的
    与Spring整合的Mybatis没法真正使用BatchExecutor
    Mybatis和Spring整合后sqlsession啥时候关闭的
    Mybatis和Spring的整合原理
    Mybatis是怎么执行一条语句的
    8.11查询结果排序
    8.10、11(select分组和过滤)()
    8.7、8、9(select语句基本用法)(select语句基本运算符)(select聚合查询)
    8.4SQL(DML数据操作语言)-(insert插入数据)(updata更新数据),(delete数据)
    8.2数据库DDL语言(即数据库定义语言)(命名规则以及数据类型)
  • 原文地址:https://www.cnblogs.com/grooovvve/p/10395709.html
Copyright © 2011-2022 走看看