您的位置:首页 > 理论基础 > 数据结构算法

数组的顺序结构表示和实现

2009-06-20 20:59 351 查看
#include<iostream>
#include<cstdarg>
using namespace std;
/*
数组的顺序表示和实现
*/
#define Array_dtype int
#define MAX_ARRAY_DIM 8
const int ERROR=0;
const int OK=1;
class Array
{
public:
Array(int dim,...);
~Array();
Array_dtype GetValue(int dim1,...);//取出值
void SetValue(const Array_dtype &e,...);//设置值
private:
Array_dtype *m_base;//数组元素基址
int m_dim;//数组维数
int *m_bounds;//数组维界基址
int *m_constants;//数组映像函数常量基址
bool m_flag;//是否分配内存的标志
};
Array::Array(int dim,...)
{
if(dim>=1&&dim<=MAX_ARRAY_DIM)
{
m_dim=dim;
//申请存放每一维长度大小的空间
m_bounds=new int[dim];
//将每一维长度大小放到空间里边,并计算出总元素个数
int total_elem=1;
va_list ap;
va_start(ap,dim);
for(int i=0;i!=dim;++i)
{
m_bounds[i]=va_arg(ap,int);
total_elem*=m_bounds[i];
}
va_end(ap);
//为每个元素分配空间
m_base=new int[total_elem];
//为每个维的入口地址分配空间
m_constants=new int[dim];
//计算每个维的入口地址并将结果存入空间里
m_constants[dim-1]=1;
for(int i=dim-2;i!=-1;--i)
{
m_constants[i]=m_constants[i+1]*m_bounds[i+1];
}
m_flag=true;
}
else
{
cout<<"维数设置错误!"<<endl;
m_flag=false;
}
}
Array::~Array()
{
if(m_flag)
{
delete[]m_base;
delete[]m_bounds;
delete[]m_constants;
}
}
Array_dtype Array::GetValue(int dim1,...)
{
va_list ap;
int addr=0;
addr+=dim1*m_constants[0];
va_start(ap,dim1);
for(int i=1;i!=m_dim;++i)
{
addr+=va_arg(ap,int)*m_constants[i];
}
va_end(ap);
return *(m_base+addr);
}
void Array::SetValue(const Array_dtype &e,...)//设置值
{
va_list ap;
int addr=0;
va_start(ap,e);
for(int i=0;i!=m_dim;++i)
{
addr+=va_arg(ap,int)*m_constants[i];
}
va_end(ap);
*(m_base+addr)=e;
}


根据清华大学的<数据结构>写出来的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息