数据结构之数组Array实例详解

数组Array

基本操作

Status InitArray(int dimm,...)//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK
Status DestroyArray()  //销毁数组A
Status Locate(va_list ap,int &off) //若ap指示的各下标值合法,则求出该元素在A中相对地址off
Status Value(ElemType &e,...)  //A是n维数组,e为元素变量,随后是n个下标值。若各下表不越界,则e赋值为所指定的A的元素值,并返回OK。
Status Assign(ElemType e,...)  //A是n维数组,e为元素变量,随后是n各下表值。/若各下标不越界,则将e的值付给所指定的A的元素,并返回OK。 

几个小程序(代码正误检验)

//
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-10)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define N 8
const int OK=1;
const int ERROR=0;
const int INFEASIBLE=-1;
typedef int Status;
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
LL n,m,lll,ans;

typedef int ElemType;
#include<stdarg.h>      //标准头文件,提供宏va_start、va_arg、va_end 用于存取变长参数表
const int MAX_ARRAY_DIM=8; //假设数组维数的最大值为8
typedef struct
{
  ElemType *base;     //数组元素基址,由InitArray分配
  int dim;        //数组维数
  int *bounds;      //数组维界基址,由InitArray分配
  int *constants;     //数组映像函数常量基址,由InitArray分配
  int elemtotal;
  Status InitArray(int dimm,...)//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK
  {
    int i;
    va_list ap;
    if(dimm<1 || dimm>MAX_ARRAY_DIM)return ERROR;
    dim=dimm;
    bounds=(int *)malloc(dim*sizeof(int));
    if(!bounds)exit(OVERFLOW);//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
    elemtotal=1;
    va_start(ap,dim);  //ap为va_list类型,是存放变长参量数表信息的数组
    for(i=0;i<dim;i++)
    {
      bounds[i]=va_arg(ap,int);
      if(bounds[i]<0)return UNDERFLOW;
      elemtotal*=bounds[i];
    }
    va_end(ap);
    base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
    if(!base)exit(OVERFLOW);
    constants=(int *)malloc(dim*sizeof(int));
    //求映像函数的常数ci,并存入A.constants[i-1],i=1,...,dim
    if(!constants)exit(OVERFLOW);
    constants[dim-1]=1; //L=1,指针的增减以元素的大小为单位
    for(i=dim-2;i>=0;i--)
      constants[i]=bounds[i+1]*constants[i+1];
    return OK;
  }//InitArray

  Status DestroyArray()  //销毁数组A
  {
    if(!base)return ERROR;
    free(base);base=NULL;
    if(!bounds)return ERROR;
    free(bounds);bounds=NULL;
    if(!constants)return ERROR;
    free(constants);constants=NULL;
    return OK;
  }//DestroyArray

  Status Locate(va_list ap,int &off) //若ap指示的各下标值合法,则求出该元素在A中相对地址off
  {
    int i,ind;
    off=0;
    for(i=0;i<dim;i++)
    {
      ind=va_arg(ap,int);
      if(ind<0 || ind>=bounds[i])return OVERFLOW;
      off+=constants[i]*ind;
    }
    return OK;
  }//Locate

  Status Value(ElemType &e,...)  //A是n维数组,e为元素变量,随后是n个下标值。
                  //若各下表不越界,则e赋值为所指定的A的元素值,并返回OK。
  {
    va_list ap;
    int result,off;
    va_start(ap,e);
    if((result=Locate(ap,off))<=0)return result;
    e=*(base+off);
    return OK;
  }//Value

  Status Assign(ElemType e,...)  //A是n维数组,e为元素变量,随后是n各下表值。
                  //若各下标不越界,则将e的值付给所指定的A的元素,并返回OK。
  {
    va_list ap;
    int result,off;
    va_start(ap,e);
    if((result=Locate(ap,off))<=0)return result;
    *(base+off)=e;
    return OK;
  }//Assign

}Array;
void ArrayCheck()//代码正误检验
{
  int i,j,k;
  Array A;
  ElemType e;
  A.InitArray(3,2,3,2);
  printf("维度:%d\n总元素个数:%d\n各维维界:",A.dim,A.elemtotal);
  for(i=0;i<A.dim;i++)
    printf("%d ",A.bounds[i]);
  puts("");
  for(i=0;i<A.bounds[0];i++)
    for(j=0;j<A.bounds[1];j++)
      for(k=0;k<A.bounds[2];k++)
        A.Assign(i*100+j*10+k+111,i,j,k);
  for(i=0;i<A.bounds[0];i++,puts(""))
    for(j=0;j<A.bounds[1];j++,puts(""))
      for(k=0;k<A.bounds[2];k++)
        printf("%d ",(A.Value(e,i,j,k),e));
  A.DestroyArray();
  puts("");
}
程序结果:
维度:3
总元素个数:12
各维维界:2 3 2
111 112
121 122
131 132

211 212
221 222
231 232

主函数:

int main()
{
  #ifndef ONLINE_JUDGEW
// freopen("1.txt","r",stdin);
  freopen("2.txt","w",stdout);
  #endif
  int i,j,k;
  int x,y,z,xx,yy;
// init();
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
// while(~scanf("%d%d",&n,&m))
  {
    ArrayCheck();
  }
  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

02-02 18:51