/**
***@Title :考研數據結構複習
***@Subject :數組(順序結構)
***@Author :lxfhahaha
***@language: C語言
***@Time : 2018/10/4 19:25
*****/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> //用於存取變長參數表
#include <time.h>
#define MAX_ARRAY_DIM 8 //假設數組維數的最大值爲8
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Bool;
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *base; //數組元素基址
int dim; //數組維數
int *bounds; //數組維界機基址,用於存儲每一維的長度
int *constants; //數組映像函數常量基址
}Array;
//若維數dim和隨後的各維長度合法,則構造相應的數組array,並返回ok
Status InitArray(Array *array,int dim, ... ){
int i,j;
if(dim<1||dim>MAX_ARRAY_DIM){
printf("Error Dim!!\n");
return ERROR;
}
array->dim=dim;
array->bounds=(int*)malloc(sizeof(int)*dim);
if(!array->bounds){
printf("Malloc Error!\n");
exit(0);
}
int elemtotal=1;
va_list ap;
va_start(ap,dim);
for(i=0;i<dim;i++){
array->bounds[i]=va_arg(ap,int);
elemtotal *= array->bounds[i];
}
va_end(ap);
array->base=(ElemType*)malloc(sizeof(ElemType)*elemtotal);
array->constants=(int*)malloc(sizeof(int)*dim);
if(!array->base||!array->constants){
printf("Malloc Error!\n");
exit(0);
}
array->constants[dim-1]=1; //最後的一維是一維數組,,參數固定爲1
for(j=dim-2;j>=0;j--){
array->constants[j]=array->constants[j+1]*array->bounds[j+1];
}
return OK;
}
//銷燬數組array
Status DestroyArray(Array *array){
if(!array->base) return ERROR;
free(array->base);
array->base=NULL;
if(!array->bounds) return ERROR;
free(array->bounds);
array->bounds=NULL;
if(!array->constants) return ERROR;
free(array->constants);
array->constants=NULL;
return OK;
}
//若ap所指示的各下標值合法,則求出個該元素在array中相對地址off
Status Locate(Array array, va_list ap, int *off)
{
int i,j;
*off = 0;
for(i=0;i<array.dim;i++){
j=va_arg(ap,int); //依次取出每一維的下標
if (j<0||j>array.bounds[i])
{ printf("j:%d,,bo:%d\n",j, array.bounds[i]); return ERROR;}
*off += array.constants[i]*j;//計算待存取的元素和數組基址的距離
}
return OK;
}
//array是n維數組,e爲元素變量,隨後是n個下標值
//若各下標不超界,則e賦值爲所指定的array的元素值,並返回OK
Status Value(Array array,ElemType *e, ...){
int off;
if(!array.base){
printf("Error!! Please inital first!!\n");
return ERROR;
}
va_list ap;
va_start(ap,e);
if(!Locate(array,ap,&off)){
printf("Locate Error!!\n");
return ERROR;
}
va_end(ap);
*e=*(array.base+off);
return OK;
}
//array是n維數組,e爲元素變量,隨後是n個下標值
//若下標不超界,則將e的值賦給指定的array的元素值,並返回OK
Status Assign(Array *array,ElemType e, ...){
int off;
if(!array->base){
printf("Error!! Please inital first!!\n");
return ERROR;
}
va_list ap;
va_start(ap,e);
if(!Locate(*array,ap,&off)){
printf("Locate Error!!\n");
return ERROR;
}
va_end(ap);
*(array->base+off)=e;
return OK;
}
int main(){
int i,j,k;
ElemType temp;
Array array;
InitArray(&array,3,5,3,7);
for(i=0;i<array.bounds[0];i++)
for(j=0;j<array.bounds[1];j++)
for(k=0;k<array.bounds[2];k++)
Assign(&array,i+j+k,i,j,k);
printf("Dim: %d :\n",array.dim);
printf("bounds->[");
for(i=0;i<array.dim;i++){
printf("%d",array.bounds[i]);
if(i<array.dim-1) printf(",");
}
printf("]\n");
for(i=0;i<array.bounds[0];i++){
for(j=0;j<array.bounds[1];j++){
for(k=0;k<array.bounds[2];k++){
Value(array,&temp,i,j,k);
printf("%5d",temp);
}
printf("\n");
}
printf("\n");
}
DestroyArray(&array);
}
考研數據結構複習——數組(順序結構)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.