資料結構實驗 多維陣列的實現
資料結構實驗 多維陣列的實現
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>//用於存取變長參數列
#define MAX_DIM 8//假設陣列維數的最大值為8
typedef struct
{
int *base;//陣列元素基址
int dim;//陣列維數
int *bounds;//陣列維數基址,例如維數dim=3,bounds[0]=2,bounds[1]=3,bounds[2]=4,表示2頁3行4列的陣列
int *constants;//陣列映像函式常量基址
/* 例如對於2頁3行4列的陣列,有constants[2]=1,constants[1]=4,constants[0]=12,
給定一個下標A[0][1][2],0*12+1*4+2*1=6,元素存取在當前陣列的第6個位置,再加上base即可找到它的地址
*/
}Array;
bool init(Array &A,int dim,...)//構造陣列
{
if(dim<1||dim>MAX_DIM)
return false;
A.dim=dim;
A.bounds=(int *)malloc(dim*sizeof(int));
if(!A.bounds) return false;
int total=1;//求元素總數
va_list list;//存放變長參數列資訊的陣列list
va_start(list,dim);
for(int i=0;i<dim;i++)
{
A.bounds[i]=va_arg(list,int);
if(A.bounds[i]<=0)
return false;
total*=A.bounds[i];
}
va_end(list);
A.base=(int *)malloc(total*sizeof(int));
if(!A.base) return false;
A.constants=(int *)malloc(dim*sizeof(int));
if(!A.constants) return false;
A.constants[dim-1]=1;//最後一維為1,指標的增減以元素的大小為單位
for(int i=dim-2;i>=0;i--)
A.constants[i]=A.bounds[i+1]*A.constants[i+1];
return true;
}
bool destroy(Array &A)//銷燬陣列
{
if(!A.base) return false;
free(A.base); A.base=NULL;
if(!A.bounds) return false;
free(A.bounds); A.bounds=NULL;
if(!A.constants) return false;
free(A.constants); A.constants=NULL;
return true;
}
bool locate(Array &A,va_list list,int &off)//求元素在陣列A中的相對地址off
{
off=0;
for(int i=0;i<A.dim;i++)
{
int temp=va_arg(list,int);
if(temp<0||temp>=A.bounds[i]) return false;
off+=A.constants[i]*temp;
}
return true;
}
bool value(Array &A,int &e,...)//將e賦值為所指定的A的元素值
{
va_list list;
va_start(list,e);
int off=0;
if(!locate(A,list,off)) return false;
e=*(A.base+off);
va_end(list);
return true;
}
bool assign(Array &A,int e,...)//將e賦值給所指定的A的元素
{
va_list list;
va_start(list,e);
int off=0;
if(!locate(A,list,off)) return false;
*(A.base+off)=e;
va_end(list);
return true;
}
void print(Array &A)//列印陣列各元素的值
{
int total=1;
for(int i=0;i<A.dim;i++)
total*=A.bounds[i];
for(int i=0;i<total;i++)
{
printf("%d\t",*(A.base+i));
if((i+1)%A.bounds[A.dim-1]==0)
printf("\n");
}
}
int main()
{
//資料測試
Array A;
init(A,3,2,3,4);//構造陣列:3維陣列,2頁3行4列
int temp=0;
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<4;k++)
assign(A,++temp,i,j,k);
printf("陣列各元素的值為:\n");
print(A);//列印陣列各元素的值
int e;
value(A,e,0,1,3);
printf("元素(0,1,3)的值為%d\n",e);
e=99;
for(int i=0;i<4;i++)
assign(A,e,1,2,i);//將第1頁第2行中的所有元素值修改為99
printf("將第1頁第2行中的所有元素值修改為99\n");
printf("陣列各元素的值為:\n");
print(A);//列印陣列各元素的值
destroy(A);//銷燬陣列
return 0;
}
相關文章
- 資料結構實驗 二維矩陣的實現資料結構矩陣
- js實現資料結構--陣列JS資料結構陣列
- 資料結構之php實現陣列資料結構PHP陣列
- 資料結構--單連結串列(通過陣列實現)資料結構陣列
- js實現資料結構--佇列JS資料結構佇列
- 資料結構與演算法系列(一)陣列實現資料結構演算法陣列
- 資料結構-棧(通過陣列和單向連結串列實現)資料結構陣列
- 資料結構-陣列資料結構陣列
- 資料結構 - 陣列資料結構陣列
- 資料結構之php實現佇列資料結構PHP佇列
- 資料結構實驗5、鏈佇列的基本操作資料結構佇列
- 資料結構之陣列和矩陣--矩陣&不規則二維陣列資料結構陣列矩陣
- 資料結構與演算法分析(c 語言描述)多項式 ADT 陣列實現資料結構演算法陣列
- C# 一維陣列如何快速實現陣列元素的資料型別的轉換?C#陣列資料型別
- 每日一道演算法題之陣列實現資料結構演算法陣列資料結構
- 【php實現資料結構】鏈式佇列PHP資料結構佇列
- 資料結構-js實現棧和佇列資料結構JS佇列
- 資料結構-迴圈佇列(Python實現)資料結構佇列Python
- 資料結構實驗(4)資料結構
- 資料結構實驗1資料結構
- Leetcode LRU快取,陣列+結構體實現LeetCode快取陣列結構體
- 資料結構之「陣列」資料結構陣列
- 資料結構之陣列資料結構陣列
- 資料結構2——陣列資料結構陣列
- 實現二維陣列的行列互換陣列
- 多維陣列轉一維陣列(降維的多種方式)陣列
- 歸併排序:陣列和連結串列的多種實現排序陣列
- php實現基本資料結構之棧、佇列PHP資料結構佇列
- 資料結構--LinkedList的實現資料結構
- Java版-資料結構-陣列Java資料結構陣列
- LeetCode之資料結構——陣列LeetCode資料結構陣列
- JS資料結構(一)——陣列JS資料結構陣列
- JavaScript資料結構01 - 陣列JavaScript資料結構陣列
- 資料結構——樹狀陣列資料結構陣列
- Java實現普通二維陣列和稀疏陣列的相互轉換Java陣列
- 詳細分析棧和佇列的資料結構的實現過程(Java 實現)佇列資料結構Java
- 多維陣列陣列
- 資料結構實驗:連結串列的應用資料結構