考研數據結構複習——數組(順序結構)

/**
***@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);
 
}
 	

運行效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章