(严蔚敏版)数组的顺序存储表示和实现代码

#include<stdarg.h>
 #include<malloc.h> /* malloc()等 */
 #include<stdio.h> /* EOF(=^Z或F6),NULL */
 #include<stdlib.h> /* atoi() */
 #include<io.h> /* eof() */
 #include<math.h> /* floor(),ceil(),abs() */
 #include<process.h> /* exit() */
 /* 函数结果状态代码 */


 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


 typedef int ElemType;




 #define MAX_ARRAY_DIM 8 /* 假设数组维数的最大值为8 */
 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=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 */
   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;
 }




 void main()
 {
   Array A;
   int i,j,k,*p,dim=3,bound1=3,bound2=4,bound3=2; /* a[3][4][2]数组 */
   ElemType e,*p1;
   InitArray(&A,dim,bound1,bound2,bound3); /* 构造3*4*2的3维数组A */
   p=A.bounds;
   printf("A.bounds=");
   for(i=0;i<dim;i++) /* 顺序输出A.bounds */
     printf("%d ",*(p+i));
   p=A.constants;
   printf("\nA.constants=");
   for(i=0;i<dim;i++) /* 顺序输出A.constants */
     printf("%d ",*(p+i));
   printf("\n%d页%d行%d列矩阵元素如下:\n",bound1,bound2,bound3);
   for(i=0;i<bound1;i++)
   {
     for(j=0;j<bound2;j++)
     {
       for(k=0;k<bound3;k++)
       {
         Assign(&A,i*100+j*10+k,i,j,k); /* 将i*100+j*10+k赋值给A[i][j][k] */
         Value(&e,A,i,j,k); /* 将A[i][j][k]的值赋给e */
         printf("A[%d][%d][%d]=%2d ",i,j,k,e); /* 输出A[i][j][k] */
       }
       printf("\n");
     }
     printf("\n");
   }
   p1=A.base;
   printf("A.base=\n");
   for(i=0;i<bound1*bound2*bound3;i++) /* 顺序输出A.base */
   {
     printf("%4d",*(p1+i));
     if(i%(bound2*bound3)==bound2*bound3-1)
       printf("\n");
   }
   DestroyArray(&A);
   system("PAUSE");
 }
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特殊权限

2.18特殊的权限set_uid [rootcentos-01 ~]# which passwd //查询一下passwd位置// /usr/bin/passwd[rootcentos-01 ~]# ls -l /usr/bin/passwd //查询一下passwd权限//-rwsr-xr-x. 1 root root 27832 6月 …

我的职场战争--一年来的开发组内战实录

一 战争准备阶段 一年前&#xff0c;国内分社派我带着几名程序员来到日本&#xff0c;进入一个世界级大公司做项目&#xff0c;这里先期驻在了一个日本总社的社员X。没有人想到战争已经临近。 二 战争酝酿阶段 日本人不会叫你闲着&#xff0c;头一个月就开始了下马威。…

linux8重启服务代码,linux(centos8):安装分布式事务服务seata(seata 1.3.0/centos 8.2)

一&#xff0c;什么是seata?Seata:Simpe Extensible Autonomous Transcaction Architecture&#xff0c;是阿里中间件,开源的分布式事务解决方案。前身是阿里的Fescar官方站:http://seata.io/zh-cn/官方代码地址:https://github.com/seata/seata官方文档站:http://seata.io/zh…

数组与矩阵的区别

数组中的元素可以是字符等 矩阵中的只能是数 这是二者最直观的区别。 因为矩阵是一个数学概念&#xff08;线性代数里的&#xff09;&#xff0c;数组是个计算机上的概念。 《精通MATLAB6.5版》&#xff08;张志涌编著&#xff0c;北京航空航天大学出版社&#xff09;中说&…

android自定义view(自定义数字键盘)

序言&#xff1a;在上周的项目中&#xff0c;需要做一个密码锁的功能&#xff0c;然后密码下面还得有键盘&#xff0c;就类似支付宝支付的时候那样&#xff1a; 当然了&#xff0c;我们项目的需求简单点&#xff0c;纯数字的就可以了&#xff0c;然后上周就百度了自定义键盘&am…

linux环境部署ltmj,Linux系统安装与简单配置 图文.docx

合肥师范学院实验报告姓名:课程名称&#xff1a;Linux院(系&#xff1a;计算机学院 专业/年级:实於Lin^系缭公装与苗瑕肚卅1.占克If Jf VVVork51at>un ?- If -JpMHIWortsktKia^2.?JGJiIjxiS4CLM.lt 1H. iuFI?H?*vW ?tVirtujl Machine Wisa rdGimm Oprraimv加蓟aBMkonA …

矩阵的压缩存储

5.3 矩阵的压缩存储 矩阵是很多科学与工程计算问题中研究的数学对象&#xff0c;在此&#xff0c;我们讨论如何存储矩阵的元&#xff0c;从而使矩阵的各种运算能有效第进行。对于一个矩阵结构显然用一个二维数组来表示是非常恰当的&#xff0c;但在有些情况下&#xff0c;比如常…

网络工程师还要学linux吗,网络工程师要学什么

想成为一个优秀的网络工程师&#xff0c;要学什么&#xff0c;怎么学呢?今天小编带你了解一下网络工程师到底要学什么。上篇我们讲到了“网络工程师发展方向”&#xff0c;列举了许多技术方向&#xff0c;那么我们该如何根据自己的定位选择学习哪些技术。重点是哪些&#xff0…

利用FormData对象实现AJAX文件上传功能及后端实现

包括HTML基础设置、CSS界面优化、JS利用FormData对象和AJAX进行上传、后端接收文件并存储到指定路径以及删除文件操作。FE HTML 基础的设置&#xff1a; <form enctype"multipart/form-data"><input id"file" type"file" multiple"…

第 6 章 —— 装饰模式

6.6 装扮模式总结 装饰模式把每个要装饰的功能放在单独的类中&#xff0c;并让这个类包装它所要装饰的对象&#xff0c;因此&#xff0c;当需要执行特殊行为时&#xff0c;客户端代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。 装扮模式是为已有功能动…

广义表及其存储方式简介

广义表&#xff08;Lists&#xff0c;又称列表&#xff09;是线性表的推广。线性表定义为n>0个元素a1,a2,a3,…,an的有限序列。线性表的元素仅限于原子项&#xff0c;原子是作为结构上不可分割的成分&#xff0c;它可以是一个数或一个结构&#xff0c;若放松对表元素的这种限…

Vue.js:路由

ylbtech-Vue.js&#xff1a;路由1.返回顶部 1、Vue.js 路由 本章节我们将为大家介绍 Vue.js 路由。 Vue.js 路由允许我们通过不同的 URL 访问不同的内容。 通过 Vue.js 可以实现多视图的单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。 Vue.…

图片转excel:“保留数字格式”在什么场景下该勾

保留数字格式是什么意思呢&#xff1f;顾名思义&#xff0c;就是将转出来的数字保留为数字格式&#xff0c;而不是文本格式。我们知道&#xff0c;OCR程序将图片上的文字识别为电脑可编辑的文字后&#xff0c;如果导入到excel不加处理&#xff0c;则单个数字过长的文字就会被ex…

html概述和基本结构

html概述 HTML是 HyperText Mark-up Language 的首字母简写&#xff0c;意思是超文本标记语言&#xff0c;超文本指的是超链接&#xff0c;标记指的是标签&#xff0c;是一种用来制作网页的语言&#xff0c;这种语言由一个个的标签组成&#xff0c;用这种语言制作的文件保存的是…

linux添加三权,基于SELinux的三权分离技术的研究

目前&#xff0c;Linux操作系统已广泛应用于各种设备和产品中&#xff0c;如服务器、PC机、机顶盒及路由器等。随着Linux系统的不断发展和广泛应用&#xff0c;Linux系统的安全问题也引起越来越多的关注。在Linux操作系统中&#xff0c;存在一个超级用户即root用户。root也称为…

二叉树、树和有序树的区别

树&#xff1a;子树没有左右之分 二叉树、有序树:左右有序 二叉树与有序树&#xff1a;在只有一棵树的情况下&#xff0c;二叉树有左右之分、有序树无左右之分 另外&#xff1a;二叉树是有序的&#xff0c;可以为空或一个根节点以及两个分别称为左子树和右子树的互不相交的二叉…

高效程序员

软件开发人员的作战手册 - 让程序员活的久一点 1. 程序员的职业准则是&#xff1a;诚实&#xff08;如实的报告你的状态&#xff0c;风险和出现的问题&#xff09;&#xff0c;守信&#xff08;承诺完成的任务就要按时完成&#xff09;&#xff0c;尊重&#xff08;尊重给你的代…

PHP学习笔记1

1.什么是PHP&#xff1f; Hypertext Preprocessor(超文本预处理语言)。 是脚本语言。 是最流行的网站开发语言。 2.PHP能做什么&#xff1f; 可以生成动态页面内容。 可以创建、打开、读取、写入、关闭服务器上的文件。 可以手机表单数据。 可以发送和接收cookies。&#xf…

Redis在windows下的配置

原文:Redis在windows下的配置 Redis在windows下的配置&#xff08;在windows-64下安装redis&#xff0c;请参考微软redis的github&#xff1a;https://github.com/MSOpenTech/redis/releases&#xff09;下面是windows32的配置 下载地址http://files.cnblogs.com/files/cuiweny…

linux磁盘符变化autofs,Linux基础教程学习笔记之Autofs自动挂载

Linux基础教程学习笔记之Autofs自动挂载Autofs自动挂载&#xff1a;yum -y install autofsvim /etc/auto.master 在文件中添加下面行/home/guests /etc/auto.tianyunvim /etc/auto.tianyun 子挂载点监控ldapuser0 -rw,sync classroom:/home/guests/ldapuser0systemctl enable …