数据结构之数组Array实例详解
数据结构之数组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; }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇:C++时间戳转化操作实例分析【涉及GMT与CST时区转化】
栏 目:C语言
下一篇:C语言矩阵连乘 (动态规划)详解
本文标题:数据结构之数组Array实例详解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/1533.html
您可能感兴趣的文章
- 01-10求子数组最大和的解决方法详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10APUE笔记之:进程环境详解
- 01-10如何寻找数组中的第二大数
- 01-10深入线性时间复杂度求数组中第K大数的方法详解
- 01-10内部排序之堆排序的实现详解
- 01-10进程间通信之深入消息队列的详解
- 01-10数组中求第K大数的实现方法
- 01-10深入理解数组指针与指针数组的区别
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10SublimeText编译C开发环境设置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法实例总结
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-11ajax实现页面的局部加载
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?