实验四 结构数组
本次继续更新数据结构与算法这门课的上机实验,主要涉及结构数组这一数据结构的基本操作。
特此感谢, 实验过程中邓老师的指导和帮助!
对于想要获取此实验报告和源代码的同学,欢迎光顾小生寒舍 GitHub:https://github.com/ChromeWei?tab=repositories
实验内容
一、参考教材,编写顺序表的相关程序(定义,初始化,插入,删除,取值,赋值等等)
二、实现Print函数,用作数组的输出。
三、继续编写main函数,初始化一个新4维数组,各维长度从高到低分别等于5,4,3,2。将原有数组的值赋给新数组,并输出结果。规则如下:
新数组[L][K][J][I]=原数组[I][J][K][L]
测试环境:Win10, VisualC++ 6.0
附件: 源代码
#include <stdarg.h> //标准头文件,提供宏va_start、va_arg和va_end,
//用于存取变长参数表
#include "stdlib.h"
#include "iostream.h"
#define MAX_ARRAY_DIM 8 //假设数组维数的最大值为8
#define ElemType int
#define OVERFLOW 1
#define ERROR false
#define OK true
#define Status bool
typedef struct{
ElemType *base; //数组元素基址,由 InitArray 分配
int dim; //数组维数
int* bounds; //数组维界基址,由 InitArray 分配
int* constants; //数组映像函数常量基址,由 InitArray 分配
} Array;
Status InitArray(Array &A,int dim,...){
//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK
int 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);
//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtoal
elemtotal=1;
va_start(ap,dim); //ap为va_list类型,是存放变长参数表信息的数组
for(int i=0;i<dim;++i){
A.bounds[i]=va_arg(ap,int);
if(A.bounds[i]<=0)
return ERROR;
elemtotal*= A.bounds[i];
}
va_end(ap);
A.base=(ElemType*)malloc(elemtotal*sizeof(ElemType));
if(!A.base) exit(OVERFLOW);
//求映像函数的常数Ci,并存入A.constants[i-1],i = 1,...,dim
A.constants=(int*)malloc(dim*sizeof(int));
if(!A.constants) exit(OVERFLOW);
A.constants[dim-1]=1; //L = 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
if(!A.base) return ERROR;
fre(A.base); A.base=NULL;
if(!A.bounds) rturn ERROR;
free(A. bounds); A.ounds = NULL;
if(!A.constants) rturn ERROR;
free(A.constants); A.onstants = NULL;
return OK;
}
Status Locate(Array& A,va_list ap,int& off){
//若ap指示的各下标合法,则求出该元素在A中相对地址off
int ind;
off=0;
for(int i=0;i<A.dim;++i){
ind=va_arg(ap,int);
if(ind<0||ind>=A.bounds[i])
return ERROR;
off+=A.constants[i]*ind;
}
return OK;
}
Status Value(Array& A,ElemType& e,int NoUse,...){
//取值。因为省略号前的参数不能是引用类型,所以加入一个参数int NoUse,
//其参数值没有使用,调用的时候随便给个整数即可
int off;
va_list ap;
va_start(ap,NoUse);
if(!Locate(A,ap,off))
{cout<<"eroor"<<endl;
return ERROR;
}
e=*(A.base+off);
return OK;
}
Status Assign(Array& A, ElemType e,...){//赋值
int off;
va_list ap;
va_start(ap,e);
if(!Locate(A,ap,off))
{
return ERROR;
}
*(A.base+off)=e;
return OK;
}
void Print(Array arr){
int eletotall = 1;
//Error case:
//while(--arr.dim)
//eletoall *= arr.bounds[arr.dim];
for(int n = 0 ; n<arr.dim;n++)
eletotall *= arr.bounds[n];
for(int i=0; i < eletotall; i++){
cout<< arr.base[i] << " ";
//if(i%10) cout<<endl; //每十个一行输出
}
cout<<endl<<endl;
}
Status replace(Array &Arr,Array& arr){
//新数组Arr[L][K][J][I]=原数组arr[I][J][K][L]
int i,j,k,l;
ElemType e;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
for(k=0;k<4;k++)
for(l=0;l<5;l++){
Value(arr,e,10,i,j,k,l); //取值
Assign(Arr,e,l,k,j,i); //原数组赋值
}
return OK;
}
void main()
{
Array arr,Arr;
int i,j,k,l;
InitArray(arr,4,2,3,4,5);//4维数组,各维长度从高到低等于2,3,4,5
int a=0;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
for(k=0;k<4;k++)
for(l=0;l<5;l++)
Assign(arr,++a,i,j,k,l);//原数组赋值
Print(arr); //待实现,用以实现数组的全部输出。
//新数组[L][K][J][I]=原数组[I][J][K][L]
InitArray(Arr,4,5,4,3,2);
if(!replace(Arr,arr)) return;
Print(Arr); //输出新数组
}
上一篇:数据结构与算法上机实验三 队列
欢迎各位订阅我,谢谢大家的点赞和专注!我会继续给大家分享我大学期间详细的实践项目。
知识星球
专为求职面试中算法与数据结构的小伙伴,创了学习交流/刷题群(知识星球)!想要最快的提升算法与数据结构技能,和更多小伙伴一起来吧!
进群获取互联网大厂高频coding题库,告别刷题400道,分类整理的题库,算法思路和源代码实现配套,各个类型总结出来的解题模板,远比你一个人要强!
MaiweiAI-com | WeChat ID: Yida_Zhang2
机器学习+计算机视觉