?? bo5-1.cpp
字號:
// bo5-1.cpp 順序存儲數組(存儲結構由c5-1.h定義)的基本操作(5個)
Status InitArray(Array &A,int dim,...)
{ // 若維數dim和各維長度合法,則構造相應的數組A,并返回OK(圖5-2)
int elemtotal=1,i; // elemtotal是元素總值
va_list ap;
if(dim<1||dim>MAX_ARRAY_DIM)
return ERROR;
A.dim=dim;
A.bounds=(int *)malloc(dim*sizeof(int));
if(!A.bounds)
exit(OVERFLOW);
va_start(ap,dim);
for(i=0;i<dim;++i)
{
A.bounds[i]=va_arg(ap,int);
if(A.bounds[i]<0)
return UNDERFLOW; // 在math.h中定義為4
elemtotal*=A.bounds[i];
}
va_end(ap);
A.base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
if(!A.base)
exit(OVERFLOW);
A.constants=(int *)malloc(dim*sizeof(int));
if(!A.constants)
exit(OVERFLOW);
A.constants[dim-1]=1;
for(i=dim-2;i>=0;--i)
A.constants[i]=A.bounds[i+1]*A.constants[i+1];
return OK;
}
Status DestroyArray(Array &A)
{ // 銷毀數組A(圖5-3)
if(A.base)
{
free(A.base);
A.base=NULL;
}
else
return ERROR;
if(A.bounds)
{
free(A.bounds);
A.bounds=NULL;
}
else
return ERROR;
if(A.constants)
{
free(A.constants);
A.constants=NULL;
}
else
return ERROR;
return OK;
}
Status Locate(Array A,va_list ap,int &off) // Value()、Assign()調用此函數
{ // 若ap指示的各下標值合法,則求出該元素在A中的相對地址off
int i,ind;
off=0;
for(i=0;i<A.dim;i++)
{
ind=va_arg(ap,int);
if(ind<0||ind>=A.bounds[i])
return OVERFLOW;
off+=A.constants[i]*ind;
}
return OK;
}
Status Value(ElemType &e,Array A,...) // 在VC++中,...之前的形參不能是引用類型
{ // ...依次為各維的下標值,若各下標合法,則e被賦值為A的相應的元素值
va_list ap;
Status result;
int off;
va_start(ap,A);
if((result=Locate(A,ap,off))==OVERFLOW) // 調用Locate()
return result;
e=*(A.base+off);
return OK;
}
Status Assign(Array &A,ElemType e,...)
{ // ...依次為各維的下標值,若各下標合法,則將e的值賦給A的指定的元素
va_list ap;
Status result;
int off;
va_start(ap,e);
if((result=Locate(A,ap,off))==OVERFLOW) // 調用Locate()
return result;
*(A.base+off)=e;
return OK;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -