数据结构与算法上机实验四 结构数组

GitHub 微信公众号 知乎 B站 CSDN

实验四 结构数组

本次继续更新数据结构与算法这门课的上机实验,主要涉及结构数组这一数据结构的基本操作。
特此感谢, 实验过程中邓老师的指导和帮助!


对于想要获取此实验报告和源代码的同学,欢迎光顾小生寒舍 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道,分类整理的题库,算法思路和源代码实现配套,各个类型总结出来的解题模板,远比你一个人要强!

Click to see the more details

MaiweiAI-com | WeChat ID: Yida_Zhang2

机器学习+计算机视觉

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charmve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值