数据结构算法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: ...
随机推荐
- mac上远程连接windows
Microsoft 适用于 Mac 的远程桌面连接客户端 2.1.1 http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1814 ...
- 【转】aspx与aspx.cs的关系
原文地址: http://www.cnblogs.com/axzxs2001/archive/2009/01/19/1378383.html 在vs中,有很多朋友问起,在一个网站项目中的aspx和as ...
- CoordinatorLayout自定义Bahavior特效及其源码分析
@[CoordinatorLayout, Bahavior] CoordinatorLayout是android support design包中可以算是最重要的一个东西,运用它可以做出一些不错的特效 ...
- JQuery功能查询页
JQuery在前端开发中已经是常用的不能再常用的库了.最近的项目中使用到了JQuery,我第一次接触它的时候为了学习,把常用的操作指令用比较小的字体写在一页word上,打印出来贴在桌子上,用来让自己时 ...
- 【python游戏编程之旅】第七篇---pygame中的冲突检测技术
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...
- .Net简单图片系统-使用说明
使用说明 1. 从github上获取代码,并部署到IIS中,应用程序池选择4.0. 2. 打开配置文件,在AppSettings中,设置SaveMode模式,如果选择的Distributed模式,需要 ...
- [BZOJ 1997][HNOI2010]Planar(2-SAT)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...
- SqlServer——批量操作(批量添加,删除)
批量添加数据: 一条insert语句批量插入多条记录 常见的insert语句,向数据库中,一条语句只能插入一条数据: insert into persons (id_p, lastname , fir ...
- eclipse的历史版本及下载
有时候我们总会遇到在需要eclipse而无法及时找到的时候, 所以那些有用的链接, 是帮助我们能够及时找到我们想要版本的额最好方式 Eclipse 3.1 IO[木卫一,伊奥] 2005 http:/ ...
- iOS 监听textfield的输入(转)
1:首先 [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEvent ...