数组---数组的基本操作

问题:

利用数组的基本运算队数组进行初始化,然后输出数组的值

涉及到数组的基本操作:初始化,赋值,定位,销毁等

代码:

头文件“SeqArray.h"

#pragma once
#define  MaxArraySize 3
#include<stdarg.h>
#include <stdio.h>
#include<stdlib.h>


typedef struct
{
	DataType *base;
	int  dim;// 数组的维数
	int *bounds; // 数组的每一位界限间的地址
	int *constants; //数组存储映像常量地址,里面的数据用来数组元素定位


}Array;

int InitArray(Array *A, int dim, ...)
/*初始化数组,根据数组的维数和各维的长度构造一个数组,为数组的所有元素分配内存单元,确定每一维的界限
地址,便于以后为数组赋值和获取数组中的元素,构造成功则返回1*/
{
	int i;
	int ElemTotal = 1;
	va_list ap;
	if (dim < 1 || dim >MaxArraySize)
	{
		return 0;
	}
	A->dim = dim;
	A->bounds = (int*)malloc(dim * sizeof(int));
	if (!A->bounds)
		exit(-1);
	va_start(ap, 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;
}

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;
}

int  AssignValue(Array A, DataType e, ...)
/*数组的赋值操作,将e的值赋给指定的数组元素,...为坐标*/
{
	va_list ap;//指向可变参数的指针
	va_start(ap, e);//ap指向e的下一个参数。。。
	int offset;
	if (LocateArray(A, ap, &offset) == 0)
		return 0;
	va_end(ap);
	*(A.base + offset) = e;
	return 1;
}

int GetValue(DataType *e, Array A, ...)
/*返回数组中指定的元素*/
{
	va_list ap;
	int offset;
	va_start(ap, A);
	if (LocateArray(A, ap, &offset) == 0)
		return -1;
	va_end(ap);
	(*e) = *(A.base+offset);
	return 1;

}

void DestroyArray(Array *A)
/*销毁数组*/
{
	if (A->base)
		free(A);
	if (A->bounds)
		free(A->bounds);
	if (A->constants)
		free(A->constants);
	A->base = A->constants = A->bounds = NULL;
	A->dim = 0;
}

源文件

// SeqArray.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//利用数组的基本运算队数组进行初始化,然后输出数组的值

#include "pch.h"
#include <iostream>
typedef int DataType;
#include"SeqArray.h"


int main()
{
	Array A;
	int i, j, k;
	int dim = 3;
	int bound1 = 5, bound2 = 3, bound3 = 2;//初始化数组的维数和各维的长度
	DataType e;
	InitArray(&A, dim, bound1, bound2, bound3);
	std::cout << "数组A的各维长度是:\n";
	for (i = 0; i < dim; i++)
	{
		printf("%3d", A.bounds[i]);
	}
	printf("\n");
	std::cout << "数组A的常量基值是:";
	for (i = 0; i < dim; i++)
	{
		printf("%3d", A.constants[i]);
	}
	printf("\n");
	printf("数组A[%d][%d][%d]的元素如下", bound1, bound2, bound3);
	for (i = 0; i < bound1; i++)
	{
		for (j = 0; j < bound2; j++)
		{
			for (k = 0; k < bound3; k++)
			{
				AssignValue(A, 100 * i + 10 * j + k, i, j, k);
				GetValue(&e, A, i, j, k);//把该元素赋值e
				printf("A[%d][%d][%d] = %3d   ", i, j, k, e);
			}
			printf("\n");
		}
		printf("\n");
	}

	printf("按照数组的先行序列输出元素,利用基地址输出元素:\n");
	for (i = 0; i < bound1*bound2*bound3; i++)
	{
		printf("第%d个元素 = %3d\t", i + 1, *(A.base + i));
		if ((i + 1) % bound2 == 0)
			printf("\n");
	}
	DestroyArray(&A);
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38904904/article/details/88929373