国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

2020-01-26 13:56:52
字體:
供稿:網(wǎng)友

C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

以下為展示順序數(shù)組的示例:

1.用C語言實(shí)現(xiàn)的版本

#include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<math.h> /* floor(),ceil(),abs() */ #include<stdlib.h> /*申請和釋放內(nèi)存*/ #include<stdarg.h> /*可變參數(shù)*/ #define OK 1 //成功標(biāo)志 #define ERROR 0 //錯(cuò)誤標(biāo)志 #define MAX_ARRAY_DIM 8 //數(shù)組最大維數(shù)  typedef int ElemType; typedef int Status; /* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */ typedef struct {   ElemType *base; /* 數(shù)組元素基址,由InitArray分配 */   int dim; /* 數(shù)組維數(shù) */   intint *bounds; /* 數(shù)組維界基址,由InitArray分配 */   intint *constants; /* 數(shù)組映象函數(shù)常量基數(shù),相當(dāng)于每一維度的權(quán)重值,由InitArray分配 */ }Array;  /* 順序存儲數(shù)組的基本操作*/ Status InitArray(Array *A, int dim, ...) { /* 若維數(shù)dim和各維長度合法,則構(gòu)造相應(yīng)的數(shù)組A,并返回OK */   int elemtotal = 1, i; /* elemtotal是元素總值 */   if (dim<1 || dim>MAX_ARRAY_DIM) //判斷數(shù)組維數(shù)   {     return ERROR;   }   (*A).dim = dim; /* 數(shù)組維數(shù) */   (*A).bounds = (intint *)malloc(dim*sizeof(int)); /* 數(shù)組維界基址 */   if (!(*A).bounds)   {     exit(OVERFLOW);   }    va_list ap;   va_start(ap, dim);   for (i = 0; i < dim; ++i)   {     (*A).bounds[i] = va_arg(ap, int);     if ((*A).bounds[i] < 0)     {       return UNDERFLOW; /* 在math.h中定義為4 */     }     elemtotal *= (*A).bounds[i];   }   va_end(ap);    (*A).base = (ElemType *)malloc(elemtotal*sizeof(ElemType));   if (!(*A).base)   {     exit(OVERFLOW);   }    (*A).constants = (intint *)malloc(dim*sizeof(int));   if (!(*A).constants)   {     exit(OVERFLOW);   }        (*A).constants[dim - 1] = 1;   for (i = dim - 2; i >= 0; --i)    {     (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1];   }        return OK; }  /* 銷毀數(shù)組A */ Status DestroyArray(Array *A) {    if ((*A).base)   {     free((*A).base);     (*A).base = NULL;   }   else   {     return ERROR;   }        if ((*A).bounds)   {     free((*A).bounds);     (*A).bounds = NULL;   }   else   {     return ERROR;   }    if ((*A).constants)   {     free((*A).constants);     (*A).constants = NULL;   }   else   {     return ERROR;   }    return OK; }  /* 若ap指示的各下標(biāo)值合法,則求出該元素在A中的相對地址off */ /* Value()、Assign()調(diào)用此函數(shù) */ Status Locate(Array A, va_list ap, intint *off)  {   int i, ind;   *off = 0;   for (i = 0; i < A.dim; ++i)   {     ind = va_arg(ap, int);     if (ind < 0 || ind >= A.bounds[i])     {       return OVERFLOW;     }     *off += A.constants[i] * ind;   }   return OK; }  /* ...依次為各維的下標(biāo)值,若各下標(biāo)合法,則e被賦值為A的相應(yīng)的元素值 */ Status Value(ElemType *e, Array A, ...) {   va_list ap;   Status result;   int off;   va_start(ap, A);   if ((result = Locate(A, ap, &off)) == OVERFLOW) /* 調(diào)用Locate() */   {     return result;   }   *e = *(A.base + off);   return OK; }  /* ...依次為各維的下標(biāo)值,若各下標(biāo)合法,則將e的值賦給A的指定的元素 */ Status Assign(Array *A, ElemType e, ...) {    va_list ap;   Status result;   int off;   va_start(ap, e);   if ((result = Locate(*A, ap, &off)) == OVERFLOW) /* 調(diào)用Locate() */   {     return result;   }   *((*A).base + off) = e;   return OK; }  void main() {   Array A;   int i, j, k, *p, dim = 3, bound1 = 3, bound2 = 4, bound3 = 2; /* a[3][4][2]數(shù)組 */   ElemType e, *p1;    /* 構(gòu)造3*4*2的3維數(shù)組A */   InitArray(&A, dim, bound1, bound2, bound3);     /* 順序輸出A.bounds */   printf("輸出數(shù)組各維度的值:/n ");   p = A.bounds;   for (i = 0; i < dim; ++i)   {     printf("A.bounds[%d] = %d/n ", i, *(p + i));   }   printf("/n");    /* 順序輸出A.constants */   printf("輸出數(shù)組映像函數(shù)常量基數(shù)的值(相當(dāng)于每一維度的權(quán)重值):/n ");   p = A.constants;   for (i = 0; i < dim; ++i)   {     printf("A.constants[%d] = %d/n ", i, *(p + i));   }   printf("/n/n");    printf("%d頁%d行%d列矩陣元素如下:/n", bound1, bound2, bound3);   for (i = 0; i < bound1; ++i)   {     printf("第%d頁:/n", i);     for (j = 0; j < bound2; ++j)     {       for (k = 0; k < bound3; ++k)       {         Assign(&A, i * 100 + j * 10 + k, i, j, k); /* 將i*100+j*10+k賦值給A[i][j][k] */         Value(&e, A, i, j, k); /* 將A[i][j][k]的值賦給e */         printf("A[%d][%d][%d]=%2d ", i, j, k, e); /* 輸出A[i][j][k] */       }       printf("/n");     }     printf("/n");   }    p1 = A.base;   printf("順序輸出Array的元素/n");   for (i = 0; i < bound1*bound2*bound3; ++i) /* 順序輸出A.base */   {     printf("%4d", *(p1 + i));     //輸出換行     if (i % (bound2*bound3) == (bound2*bound3 - 1))     {       printf("/n");     }   }    /* 銷毀數(shù)組A */   DestroyArray(&A); } 

運(yùn)行結(jié)果如下圖所示:

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 安丘市| 金寨县| 昔阳县| 巴塘县| 大余县| 铁岭市| 信宜市| 大安市| 尚义县| 右玉县| 思南县| 兖州市| 禹州市| 时尚| 仪陇县| 全州县| 宽甸| 玉门市| 夏邑县| 西林县| 长顺县| 芒康县| 丰宁| 永平县| 望奎县| 尼勒克县| 奉新县| 苍溪县| 永胜县| 平南县| 汶上县| 贵定县| 洪洞县| 岐山县| 修水县| 富川| 乌拉特中旗| 淄博市| 楚雄市| 穆棱市| 江永县|