数据结构算法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: ...
随机推荐
- XMLHTTPRequest/Ajax请求 和普通请求的区别
Ajax请求头会多一个x-requested-with参数,值为XMLHttpRequest 详情:http://blog.csdn.net/zhangdaiscott/article/details ...
- swift-sharesdk集成微信、Facebook第三方登录
好久没有写博客了.最近忙得没有时间更新博客,很忙很忙. 今天就把自己做过的第三方集成和大家分享一下,请大家多多指教. 第一步: 一.获取AppKey(去官方平台注册) 二.下载SDK 三.快速集成 第 ...
- Codeforces Round #359(div 2)
A:= v = B:^ w ^ C:一天n个小时,一个小时m分(n,m十进制),一个手表有两部分,左边表示时,右边表示分,但都是7进制,而且手表上最多只能有7个数字且数字不能重复,现在要你算出能正确表 ...
- 3n+1b 备忘录方法
题目详情 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数学家大会上公布了这个猜 ...
- Linux配置VNC实现远程图形化操纵
问题描述 有些时候需要用到图形化,其实可以通过其他途径实现.但是懒惰的就喜欢VNC,总的老说都是需要图形组件的 问题解决 在Centos测试 一.图形化的Linux 01.安装 rpm ivh vn ...
- js 基础(一)
<!--最近需要用到js相关的知识 就把在W3cSchool 下学到的东西做个笔记,方便以后再看 --><!DOCTYPE html> <html> <hea ...
- asp.net mvc输出自定义404等错误页面,非302跳转。
朋友问到一个问题,如何输出自定义错误页面,不使用302跳转.当前页面地址不能改变. 还要执行一些代码等,生成一些错误信息,方便用户提交反馈. 500错误,mvc框架已经有现成解决方法: filters ...
- Ceph浅析”系列之四——Ceph的结构
本文将从逻辑结构的角度对Ceph进行分析. Ceph系统的层次结构 Ceph存储系统的逻辑层次结构如下图所示[1]. Ceph系统逻辑层次结构 自下向上,可以将Ceph系统分为四个层次: (1)基础存 ...
- 关于QString中的arg()函数使用方法
例:正确做法:ui->label->setText(QString("Processingfile%1").arg(index));错误做法: ui->label ...
- springMVC+mybatis 增删该操作后判断影响行数一直返回-2147482646
MyBatis发现更新和插入返回值一直为"-2147482646"的错误是由defaultExecutorType设置引起的,如果设置为BATCH,更新返回值就会丢失.mybati ...