1. 数组的顺序存储表示:用一维数组按约定次序(一般为行序)来表示多维数组。
#include <iostream>
#include <stdarg.h>
using namespace std;
#define OK 1
#define ERROR -1
#define OVERFLOW -1
typedef int Status;
#define MAX_ARRAY_DIM 8//数组维数最大是8
template <class T>
struct Array{
T *base;
int dim;//维数
int *bounds; //各维长度
int *constants;//映像函数,保存每个位置的offset
Array(int dim,...)
{
if(dim<1||dim>MAX_ARRAY_DIM)
cout<<"维数超限"<<endl;
this->dim=dim;
bounds=new int[dim];
int totalelem=1; //元素总个数
va_list args;//存放变长参数表的数组
va_start(args,dim);
for(int i=0;i<dim;i++)
{
bounds[i]=va_arg(args,int);
if(bounds[i]<0)cout<<"元素长度错误"<<endl;
totalelem*=bounds[i];
}
va_end(args);
base=new T[totalelem];
//求映像函数的常数ci
constants=new int[dim];
constants[dim-1]=1;
for(int i=dim-2;i>=0;i--)
constants[i]=bounds[i+1]*constants[i+1];
}
Status Destroy()
{
delete base;
delete bounds;
delete constants;
return OK;
}
int IndexOfArray(va_list args)
{
//把输入的下标转换为数组索引值
//va_start(args,dim);
int index=-1;
for(int i=0;i<dim;i++)
{
int ind=va_arg(args,int);
if(ind<0||ind>=bounds[i])
cout<<"索引错误"<<endl;
index+=constants[i]*ind;
}
return index;
}
T Elem(...)
{
va_list args;
va_start(args,dim);
int index;
if(index=IndexOfArray(args)<0)return ERROR;
return base[index];
}
Status Assign(T e,...)
{
va_list args;
va_start(args,dim);
int index;
if(index=IndexOfArray(args)<0)return ERROR;
base[index]=e;
return OK;
}
};
int main()
{
Array<int> *a=new Array<int>(2,3,2);
a->Assign(10,0,1);
cout<<a->Elem(0,1);
}
1. 广义表的存储结构:通常为链式,每个数据元素可用一个结点表示。
#include <iostream>
using namespace std;
enum ElemType{//表示结点类型
ATOM, //原子
LIST //子表
};
typedef struct GLNode
{
ElemType type;//结点类型
union
{
int atom;
struct{GLNode*hp,*tp;}ptr;
};
}*GList;
int main()
{
GList l;
l=new GLNode();
l->atom=10;
cout<<l->atom;
}