首页 > 编程 > C > 正文

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

2020-01-26 14:07:41
字体:
来源:转载
供稿:网友

数据结构之数组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; } 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选