数据结构算法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: ...
随机推荐
- NOI2018准备Day1
今天刷基础题,字符串实在不想刷,做了20到多维数组题.老师说要10分钟一道,然而我加上整理差不多半小时一道吧... 总感觉自己效率比别人低了好多好多好多倍. 基础不牢,地动山摇,最近还是好好稳固基础题 ...
- JBOSS EAP 6.0+ Standalone模式安装成Windows服务
网上有一些文章介绍用JavaService.exe来实现,但是到EAP 6以上版本,我试过好象没成功,幸好JBoss官方已经推出了专门的工具. 一.先到官网下载http://www.jboss.org ...
- FineUI小技巧(1)简单的购物车页面
起因 最初是一位 FineUI 网友对购物车功能的需求,需要根据产品单价和数量来计算所有选中商品的总价. 这个逻辑最好在前台使用JavaScript实现,如果把这个逻辑移动到后台C#实现,则会导致过多 ...
- 浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式
一: WCF的服务端与客户端在通信时有三种模式:请求响应模式.数据报模式和双工通讯模式. 说一下基本知识, 1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契 ...
- 深入理解OOP(第一天):多态和继承(初期绑定和编译时多态)
在本系列中,我们以CodeProject上比较火的OOP系列博客为主,进行OOP深入浅出展现. 无论作为软件设计的高手.或者菜鸟,对于架构设计而言,均需要多次重构.取舍,以有利于整个软件项目的健康构建 ...
- 数据契约(DataContract)及序列化指定输出字段
服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...
- C 语言学习的第 02 课:C 语言的开发环境
工欲善其事,必先利其器.不知道还是不是记得上一篇文章中说到的,计算机本身是一个数据输入及输出的设备.所以,为了将你大脑中的各种 idea 输入到电脑,且最终生成能够执行的程序,总是要预备点什么的. 通 ...
- mybatis字符串模糊匹配
1. 参数中直接加入%%,注意不需要加两个单引号,加了就会出错,因为系统会自动为字符串类型加上两个单引号 <select id="selectPersons" result ...
- ipython又一方便的调试和应用工具!!!
控制台下://ipython 命令丰富 比如:ls 显示目录 ipython --pylab %run -p *.py quit关闭 示例: In []: %run -p test.py H ...
- linux基础-第十五单元 软件包的管理
使用RPM安装及移除软件 什么是RPM rpm的文件名 rpm软件安装与移除工作中经常使用的选项 查看RPM软件包中的信息 查询已安装的软件包信息 RPM包的属性依赖性问题 什么是RPM包的属性依赖性 ...