_DataStructure_C_Impl:Array

#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#define MaxArraySize 2
typedef int DataType;
typedef struct{
	DataType *base;	//数组元素的基地址
	int dim;		//数组的维数
	int *bounds;	//数组的每一维之间的界限的地址
	int *constants; //数组存储映像常量基地址
}Array;
//数组的初始化操作
int InitArray(Array *A,int dim,...){
	int elemtotal=1,i;	//elemtotal是数组元素总数,初值为1
	va_list ap;		//声明va_list
	if(dim<1||dim>MaxArraySize)		//如果维数不合法,返回0
		return 0;
	A->dim=dim;
	A->bounds=(int *)malloc(dim*sizeof(int));	//分配一个dim大小的内存单元
	if(!A->bounds)
		exit(-1);
	va_start(ap,dim);		//dim是一个固定参数,即可变参数的前一个参数
	for(i=0;i<dim;++i){
		A->bounds[i]=va_arg(ap,int);	//依次取得可变参数,即各维的长度
		if(A->bounds[i]<0)
			return -1;
		elemtotal*=A->bounds[i];	//得到数组中元素总的个数
	}
	va_end(ap);
	A->base=(DataType *)malloc(elemtotal*sizeof(DataType));	//为数组分配所有元素分配内存空间
	if(!A->base)
		exit(-1);
	A->constants=(int *)malloc(dim*sizeof(int));	//为数组的常量基址分配内存单元
	if(!A->constants)
		exit(-1);
	A->constants[dim-1]=1;
	for(i=dim-2;i>=0;--i)
		A->constants[i]=A->bounds[i+1]*A->constants[i+1];
	return 1;
}
//销毁数组。将动态申请的内存单元释放
void DestroyArray(Array *A){
	if(A->base)
		free(A->base);
	if(A->bounds)
		free(A->bounds);
	if(A->constants)
		free(A->constants);
	A->base=A->bounds=A->constants=NULL;	//将各个指针指向空
	A->dim=0;
}
//根据数组中元素的下标,求出该元素在A中的相对地址offset
int LocateArray(Array A,va_list ap,int *offset){
	int i,instand;
	*offset=0;
	for(i=0;i<A.dim;i++){
		instand=va_arg(ap,int);
		if(instand<0||instand>=A.bounds[i])
			return 0;
		*offset+=A.constants[i]*instand;
	}
	return 1;
}
//返回数组中指定的元素,将指定的数组的下标的元素赋值给e
int GetValue(DataType *e,Array A,...){
	va_list ap;
	int offset;
	va_start(ap,A);
	if(LocateArray(A,ap,&offset)==0)	//找到元素在数组中的相对位置
		return 0;
	va_end(ap);
	*e=*(A.base+offset);	//将元素值赋值给e
	return 1;
}
//数组的赋值操作。将e的值赋给的指定的数组元素
int AssignValue(Array A,DataType e,...){
	va_list ap;
	int offset;
	va_start(ap,e);
	if(LocateArray(A,ap,&offset)==0)	//找到元素在数组中的相对位置
		return 0;
	va_end(ap);
	*(A.base+offset)=e;	//将e赋值给该元素
	return 1;
}
void main(){
	Array A;
	DataType B[4][3]={{5,6,7},{23,45,67},{35,2,34},{12,36,90}};
	int i,j;
	int dim=2,bound1=4,bound2=3;			/*初始化数组的维数和各维的长度*/
	DataType e;
	InitArray(&A,dim,bound1,bound2);		/*构造一个4×3的二维数组A*/
	printf("数组A的各维的长度是:");
	for(i=0;i<dim;i++)						/*输出数组A的各维的长度*/
		printf("%3d",A.bounds[i]);

	printf("\n数组A的常量基址是:");
	for(i=0;i<dim;i++)						/*输出数组A的常量基址*/
		printf("%3d",A.constants[i]);
	printf("\n%d行%d列的矩阵元素如下:\n",bound1,bound2);
	for(i=0;i<bound1;i++)
	{
		for(j=0;j<bound2;j++)
		{
			AssignValue(A,B[i][j],i,j);		/*将数组B的元素赋值给A*/
			GetValue(&e,A,i,j);				/*将数组A中的元素赋值给e*/
			printf("A[%d][%d]=%3d\t",i,j,e); /*输出数组A中的元素*/
		}
		printf("\n");
	}
	printf("按照数组的线性序列输出元素,即利用基地址输出元素:\n");
	for(i=0;i<bound1*bound2;i++)			/*按照线性序列输出数组A中的元素*/
	{
		printf("第%d个元素=%3d\t",i+1,A.base[i]);
		if((i+1)%bound2==0)
			printf("\n");
	}
	DestroyArray(&A);
	system("pause");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-31 15:07:58

_DataStructure_C_Impl:Array的相关文章

PHP Warning: array_multisort(): Array sizes are inconsistent

array_multisort() 函数返回排序数组.您可以输入一个或多个数组.函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序. 遇到这报错是两个数组对比不一致导致的, 如果是一维数组与二维数组进行排序可以用以下方法解决: 使用这个方法,会比较麻烦些,要将age提取出来存储到一维数组里,然后按照age升序排列.具体代码如下: 复制代码代码如下: $ages = array();foreach ($users as $user) {    $ages[]

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

JavaScript的进阶之路(三)引用类型之Object类型和Array类型

引用类型 Object类型 function a(num){ if(num>3){ a(--num); } console.log(num); } a(5); //如何创建对象的实例 var obj1= new Object(); console.log(obj1); obj1.name="吴琼"; obj1.age=28; console.log(obj1.name+" "+obj1.age); //对象字面量语法 ,有点封装的感觉 var obj2 = {

LeetCode 442. Find All Duplicates in an Array (在数组中找到所有的重复项)

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. 1 /** 对象克隆 2 * 支持基本数据类型及对象 3 * 递归方法 */ 4 function clone(obj) { 5 var o; 6 switch (typeof obj) { 7 case "undefined": 8 break; 9 case "string": o = obj + &q

421. Maximum XOR of Two Numbers in an Array

Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum result of ai XOR aj, where 0 ≤ i, j < n. Could you do this in O(n) runtime? Example: Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum resul

JavaScript------去掉Array中重复值

转载: http://blog.csdn.net/teresa502/article/details/7926796 代码: // 删除数组中重复数据 function removeDuplElem(array){ for(var i=0; i<array.length; i++){ for(var j=i+1; j<array.length;j++){ if(array[i]==array[j]){ array = removeElement(j,array);//删除指定下标的元素 i=-

Typescript : 遍历Array的方法:for, forEach, every等

方法一,for-of 这个貌似是最常用的方法,angular 2中HTML语法绑定也是要的这种语法. let someArray = [1, "string", false]; for (let entry of someArray) { console.log(entry); // 1, "string", false } for-in 官方文档上强调了for-in和for-of的区别: let list = [4, 5, 6]; for (let i in li

opendressinghash //use resize array

1 public class opendressinghash<Key, Value> { 2 private static final int INIT_CAPACITY = 4; 3 4 private int n; 5 private int m; 6 private Key[] keys; 7 private Value[] vals; 8 9 public opendressinghash() { 10 this(INIT_CAPACITY); 11 } 12 13 public o