数据结构算法C语言实现(十七)--- 5.1&5.2数组:定义、顺序表示及实现
一.简述
理解数组位置的计算公式
LOC(j1, j2, ···, jn) = LOC(0, 0, ..., 0) + (b2 x ··· x bn x j1 + b3 x ··· x bn x j2 + ··· + bn x jn-1 + jn)L
化简为

可以缩写成

其中 cn = L,ci-1 = bi x ci, 1<i≤n。
二.头文件
//5_2.h
/**
author:zhaoyu
date:2016-6-15
*/
//----数组的顺序存储表示----
#include "head.h"
#include <stdarg.h>//表准头文件,提供宏va_start,va_arg和va_end
#define MAX_ARRAY_DIM 8//用于存取变长参数表
#define ElemType int
typedef struct {
ElemType *base;//数组元素基址,由InitArray分配
int dim;//数组维数
int *bounds;//数组维界基址,有InitArray分配
int *constants;//数组映像函数常量基址,由InitArray分配
}Array;
void test(int x1, ...)
{//测试 stdarg
va_list ap;
va_start(ap, x1);
for (int i = ; i < x1; i++)
{
printf("%d\t", va_arg(ap, int));
}
printf("\n");
} //----基本操作的算法描述----
Status InitArray(Array &A, int dim, ...)
{//若位数 dim 和各维度长度合法,则构造相应的数组A,并返回 OK
if (dim < || dim > MAX_ARRAY_DIM)
{
return ERROR;
}
A.dim = dim;
A.bounds = (int *)malloc(dim * sizeof(int));
if (!A.bounds)
{
exit(OVERFLOW);
}
//各维度长度合法,则存入A.bounds,并求出A的元素总数elemtotal
int elemtotal = ;
va_list ap;
va_start(ap, dim);//ap 为 va_list 类型,是存放变长参数表信息的数组
for (int i = ; i < dim; i++)
{
A.bounds[i] = va_arg(ap, int);
if (A.bounds[i] < )
{
return ERROR;
}
elemtotal *= A.bounds[i];
}
va_end(ap);
A.base = (ElemType *)malloc(elemtotal * sizeof(ElemType));
if (!A.base)
{
exit(OVERFLOW);
}
//求映像函数的常数 Ci,存入 A.constant[i-1], i = 1,...,dim
A.constants = (int *)malloc(dim * sizeof(int));
A.constants[dim-] = ;//L=1
for (int i = dim-; i >= ; --i)
{
A.constants[i] = A.bounds[i+] * A.constants[i+];
}
return OK;
}
Status DestroyArray(Array &A)
{//销毁数组 A
if (!A.base)
{
return ERROR;
}
free(A.base);
A.base = NULL;
if (!A.bounds)
{
return ERROR;
}
free(A.bounds);
A.bounds = NULL;
if (!A.constants)
{
return ERROR;
}
free(A.constants);
A.constants = NULL;
return OK;
}
Status Locate(Array A, va_list ap, int &off)
{//若 ap 指示的各下标之合法, 则求出该元素在 A 的相对地址 off
off = ;
for (int i = ; i < A.dim; ++i)
{
int index = va_arg(ap, int);
if (index < || index > A.bounds[i])
{
return OVERFLOW;
}
off += A.constants[i]*index;
}
return OK;
}
Status Value(Array A, ElemType &e, ...)
{// A 是 n 维数组,e 为元素变量,随后是 n 个下标值
//若各下标不越界,则 e 赋值为所指定的 A 的元素值, 并返回 OK
va_list ap;
va_start(ap, e);
int result = , off;
if ((result = Locate(A, ap, off))<=)
{
return result;
}
e = *(A.base + off);
return OK;
}
Status Assign(Array &A, ElemType e, ...)
{// A 是 n 维数组,e 为元素变量,随后是 n 个下标值
//若各下标不越界,则 e 赋给所指定的 A 的元素, 并返回 OK
va_list ap;
va_start(ap, e);
int result, off;
if ((result = Locate(A, ap, off)) <= )
{
return result;
}
*(A.base + off) = e;
return OK;
}
5_2.h
三.CPP文件
//5_2.cpp
/**
author:zhaoyu
date:2016-6-15
*/
#include "5_2.h"
int main(int argc, char const *argv[])
{
test(, , , );
Array A;
InitArray(A, , , , );
for (int i = ; i < ; ++i)
{
for (int j = ; j < ; ++j)
{
for (int k = ; k < ; ++k)
{
Assign(A, *i+j*+k, i, j, k);
}
}
}
for (int i = ; i < ; ++i)
{
printf("\n");
for (int j = ; j < ; ++j)
{
for (int k = ; k < ; ++k)
{
int e;
Value(A, e, i, j, k);
printf("%d-%d-%d\t%d\n", i, j, k, e);
}
}
}
return ;
}
5_2.cpp
四.测试

数据结构算法C语言实现(十七)--- 5.1&5.2数组:定义、顺序表示及实现的更多相关文章
- 数据结构算法C语言实现(二十七)--- 7.2图的遍历
一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
- 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作
一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- 数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现
一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...
- 数据结构算法C语言实现(十)--- 3.3栈与递归的实现
一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二. ...
- 数据结构算法C语言实现(七)--- 3.1栈的线性实现及应用举例
一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 //3_1.h /** author:zhaoyu email: ...
随机推荐
- 分析cocos2d-x中的CrystalCraze示例游戏
cocos2d-x自带了不少示例,以及几个比较简单的游戏,不过这些游戏都是用javascript binding(SpiderMonkey)做的,所以我猜测javascript binding可能是c ...
- Mecanim动画模型规范
面数控制, 以三角面计算 不要超过4边的面 光滑组,法线 单位CM,单位比例 中心点 3DMax:Reset Transform Maya:Freeze Transformation 帧率:30帧 不 ...
- poj-1410 Intersection
计算几何的题目, 学cv的要做一下.poj 地址: http://poj.org/problem?id=1410 题意:判断一个直线段,是否与一个矩形有相交点. 解决方案: 判断矩形的每一条边是否与直 ...
- htop查看系统负载
htop 是 Linux 系统中的一个互动进程查看器,可以让用户进行交互式操作,可横向或纵向滚动浏览进程列表,支持鼠标操作.用户可以在安装 htop 来监控服务器的负载. 01.下载 https:// ...
- 18位身份证验证--java实现,正则表达式
简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card)(2)preg_match(&quo ...
- java 上传图片 并压缩图片大小
Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生 ...
- java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 错误
你的ArrayList 是一个没有值的对象(不是null),也就是里面什么对象也没有存(即:arrayList.size()==0).但是,你有取它下标为0值的操作.所以,数组越界了!!比如array ...
- 【CodeVS 3153】取石子游戏
http://codevs.cn/problem/3153/ 对于这道题,直觉告诉我每一个状态一定是必胜或必败的 然后设定操作次数t,t为取完些石子最多需要多少步. 如果\(a_i\)不为1,\(t= ...
- composer更新不成功,启用国内镜像网站的配置更改办法
通过 composer config -l -g 命令可以列出 composer 的全局配置信息 [home] 配置项就是 composer 的主目录 修改config.json { "co ...
- UML类图中的六种关系及实例
前言: 设计模式是一种对于面向对象语言(C#,C++,Java)的高级应用.其思维体现出的是真正的代码设计.每一种模式都堪称巧妙!但基于各种设计模式,这里少不了基本的类图设计,本文简要列出6种关系,及 ...