數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解
更新時(shí)間:2017年05月22日 16:40:41 投稿:lqh
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解
數(shù)組Array
基本操作
Status InitArray(int dimm,...)//若維數(shù)dim和隨后的各維長度合法,則構(gòu)造相應(yīng)的數(shù)組A,并返回OK Status DestroyArray() //銷毀數(shù)組A Status Locate(va_list ap,int &off) //若ap指示的各下標(biāo)值合法,則求出該元素在A中相對地址off Status Value(ElemType &e,...) //A是n維數(shù)組,e為元素變量,隨后是n個下標(biāo)值。若各下表不越界,則e賦值為所指定的A的元素值,并返回OK。 Status Assign(ElemType e,...) //A是n維數(shù)組,e為元素變量,隨后是n各下表值。/若各下標(biāo)不越界,則將e的值付給所指定的A的元素,并返回OK。
幾個小程序(代碼正誤檢驗(yàn))
// //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> //標(biāo)準(zhǔn)頭文件,提供宏va_start、va_arg、va_end 用于存取變長參數(shù)表 const int MAX_ARRAY_DIM=8; //假設(shè)數(shù)組維數(shù)的最大值為8 typedef struct { ElemType *base; //數(shù)組元素基址,由InitArray分配 int dim; //數(shù)組維數(shù) int *bounds; //數(shù)組維界基址,由InitArray分配 int *constants; //數(shù)組映像函數(shù)常量基址,由InitArray分配 int elemtotal; Status InitArray(int dimm,...)//若維數(shù)dim和隨后的各維長度合法,則構(gòu)造相應(yīng)的數(shù)組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的元素總數(shù)elemtotal elemtotal=1; va_start(ap,dim); //ap為va_list類型,是存放變長參量數(shù)表信息的數(shù)組 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)); //求映像函數(shù)的常數(shù)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() //銷毀數(shù)組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指示的各下標(biāo)值合法,則求出該元素在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維數(shù)組,e為元素變量,隨后是n個下標(biāo)值。 //若各下表不越界,則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維數(shù)組,e為元素變量,隨后是n各下表值。 //若各下標(biāo)不越界,則將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()//代碼正誤檢驗(yàn) { int i,j,k; Array A; ElemType e; A.InitArray(3,2,3,2); printf("維度:%d\n總元素個數(shù):%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(""); }
程序結(jié)果: 維度:3 總元素個數(shù):12 各維維界:2 3 2 111 112 121 122 131 132 211 212 221 222 231 232
主函數(shù):
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語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)
- C++ 數(shù)據(jù)結(jié)構(gòu)線性表-數(shù)組實(shí)現(xiàn)
- JavaScript數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組的表示方法示例
- C語言 數(shù)據(jù)結(jié)構(gòu)之連續(xù)存儲數(shù)組的算法
- Java數(shù)組模擬優(yōu)先級隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)例
- PHP中使用數(shù)組實(shí)現(xiàn)堆棧數(shù)據(jù)結(jié)構(gòu)的代碼
- 數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組翻轉(zhuǎn)的實(shí)現(xiàn)方法
相關(guān)文章
如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
本篇文章是對如何查看進(jìn)程實(shí)際的內(nèi)存占用情況進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++進(jìn)程間共享數(shù)據(jù)實(shí)例
這篇文章主要介紹了C++進(jìn)程間共享數(shù)據(jù)的方法,是進(jìn)行C++應(yīng)用程序開發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10利用簡潔的C語言代碼解決跳臺階問題與約瑟夫環(huán)問題
這篇文章主要介紹了利用簡潔的C語言代碼解決跳臺階問題與約瑟夫環(huán)問題的方法,跳臺階問題與約瑟夫環(huán)問題是常見的基礎(chǔ)算法題目,需要的朋友可以參考下2016-02-02C++ 標(biāo)準(zhǔn)模板庫 STL 順序容器詳解
這篇文章主要介紹了C++ 標(biāo)準(zhǔn)模板庫 STL 順序容器詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟
本文主要介紹了dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C++作用域與函數(shù)重載的實(shí)現(xiàn)
本文主要介紹了C++作用域與函數(shù)重載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02