数据结构算法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: ...
随机推荐
- 《细细品味Hive》系列课程
Hi,博友: 我是解耀伟,笔名是虾皮,最近我在极客学院录制Hive系列教程,也是督促自己学习一种方式,可以把自己的学习积累有方向,星期天也能做点有意义的事情.在做每一期的过程中,需要找资料,总结,先自 ...
- SpringMVC源码分析系列
说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...
- [译]用AngularJS构建大型ASP.NET单页应用(二)
原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single 客 ...
- win8/8.1 免密码登录设置
http://www.ehow.com/how_8013338_start-windows-password.html 原文见上方链接 1,win+r调出命令输入窗口,输入 netplwiz 回车 2 ...
- 基于FPGA的通信信号源的设计
通信信号源设计原理 通过设计一个DDS信号源,然后将该信号作为载波信号,再对基带信号进行2ASK.2FSK.2PSK.2DPSK调制,进而产生多种通信信号. 设计框图如下: 将PN序列进行2ASK.2 ...
- IR的评价指标-MAP,NDCG和MRR
IR的评价指标-MAP,NDCG和MRR MAP(Mean Average Precision): 单个主题的平均准确率是每篇相关文档检索出后的准确率的平均值.主集合的平均准确率(MAP)是每个主 ...
- Win7宽带一键创建
简化创建宽带连接步骤,为简便而生. 不断分享,不断进步. 免费下载: http://yunpan.cn/cmZesi2jpJk9E 访问密码 9444
- ViewHolder数据错乱BUG
需求是这样的,在列表中用一个图标标示某个item是已经被接下或者完成的任务. 对于文件有这样的操作,进入列表后第一页面展示正常,但是加载更多后同样位置出现了同样的标志.这不是我想要的效果 我的解决办法 ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- Timer和DPC
一般两种方法使用/设置定时器,一种是使用I/O定时器例程,一种是使用DPC例程.1.定时器的实现1)使用I/O定时器例程NTSTATUSIoInitializeTimer(IN PDEVICE_OBJ ...