#include<stdarg.h> //标准头文件,提供宏va_start、va_arg、va_end
#include<stdlib.h>
#include<stdio.h>
#define MAX_ARRAY_DIM 8 //假设数组维数的最大值为8
#define OVERFLOW -2
#define UNDERFLOW -3
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct
{
int *base; //数组元素基址,假设数组类型为int
int dim; //数组维数
int *bounds; //数组维界基址
int *constants; //数组映射函数常量基址
}Array;
Status InitArray(Array *A,int dim,...);
Status Locate(Array A,va_list ap,int *off);
Status Assign(Array *A,int e,...);
Status DestroyArray(Array *A);
void main()
{
//int off;
//va_list ap;
int e;
Array array,*arr=&array;
InitArray(arr,2,1,2);
Assign(arr,1,2,3);
Value(array,&e);
printf("%d",e);
getchar();
getchar();
}
Status InitArray(Array *A,int dim,...)
{
int elemtotal,i;
va_list ap;
if (dim<1||dim>MAX_ARRAY_DIM) //判断维数是否在限制之内。如果不在之内,则返回错误
{
return ERROR;
}
A->dim=dim; //数组标识维数信息
if (!(A->bounds=(int *)malloc(dim*sizeof(int)))) //动态分配维数的大小。返回维数的首地址
{
exit(OVERFLOW);
}
elemtotal=1;
va_start(ap,dim); //存放变长参数表信息的数组。
for(i=0;i<dim;i++)
{
A->bounds[i]=va_arg(ap,int);
if (A->bounds[i]<0)
{
return UNDERFLOW;
}
elemtotal*=A->bounds[i];
}
va_end(ap);
if(!(A->base=(int*)malloc(elemtotal*sizeof(int))))
{
exit(OVERFLOW);
}
if (!(A->constants=(int *)malloc(dim*sizeof(int))))//求映像函数的常数ci,并存入A->constants[i-1],i=1,...,dim;
{
exit(OVERFLOW);
}
A->constants[dim-1]=1;
for (i = dim-2; i>0; --i)
{
A->constants[i]=A->bounds[i+1]*A->constants[i+1]; //ci=b(i+1)*c(i+1)
}
return OK;
}
Status Locate(Array A,va_list ap,int *off)
{
int i,ind;
*off=0;
for (i = 0; i <A.dim; i++)
{
ind=va_arg(ap,int);
if (ind<0||ind>=A.bounds[i])
{
return OVERFLOW;
}
*off+=A.constants[i]*ind;
}
return OK;
}
Status Assign(Array *A,int e,...)
{
int result,off;
va_list ap;
va_start(ap,e);
if ((result=Locate(*A,ap,&off))<=0)
{
return result;
}
*(A->base+off)=e;
return OK;
}
Status Value(Array A,int *e,...)
{
va_list ap;
int off,result;
va_start(ap,e);
if ((result=Locate(A,ap,&off))<=0)
{
return result;
}
*e=*(A.base+off);
}
Status DestroyArray(Array *A)
{
if (!A->base)
{
return ERROR;
}
free(A->base);
A->base=NULL;
if (!A->bounds)
{
return ERROR;
}
A->bounds=NULL;
free(A->bounds);
if (!A->constants)
{
return ERROR;
}
free(A->constants);
A->constants=NULL;
}
相关推荐
广义表的基本操作
广义表的数据结构和基本操作,含广义表的表达式合法性判断。
C语言数据结构学习——数组和广义表
C语言数据结构之数组及广义表基础
Grey Hack v0.7.3618 保姆级教程:手把手教你用metaxploit.so写一个自动提权脚本
本文详细介绍了如何在Grey Hack v0.7.3618中使用metaxploit.so库编写自动化提权脚本。从环境准备到核心功能解析,再到漏洞利用链构建和权限提升的智能处理,手把手教你掌握游戏中的高级黑客技巧。通过多库联合利用和错误处理优化,提升脚本的效率和成功率。
广义表的基本操作实现
广义表的四个特征:(1)广义线性表;(2)元素复合性;(3)元素递归性;(4)元素共享性 广义表的上述四个特征对于他的使用价值和应用效果起到了很大的作用。广义表的结构相当灵活,它可以兼容线性表、数组、树和有向图等各种常用的数据结构。当二维数组的每行或每列作为子表处理时,二维数组就是一个广义表;如果限制广义表中元素的共享和递归,广义表和树对应;如果限制广义表的递归并允许数据共享,则广义表和
eNSP-Pro配置又丢了?手把手教你用导出功能防患于未然
本文详细介绍了eNSP-Pro配置防丢失的全套方案,包括运行时内存、虚拟存储设备和宿主机文件系统的配置存储机制,以及多维度备份策略和特殊场景下的恢复技巧。通过优化保存流程、自动化定时导出和版本化管理,帮助网络工程师有效防止配置丢失,提升工作效率。
DIY玩家必备:用SSS1623芯片打造高性价比USB麦克风(附完整电路图)
本文详细介绍了如何利用SSS1623芯片DIY高性价比USB麦克风,包括元件选型、电路设计、PCB布局及调试技巧。通过完整的电路参考设计和实用建议,帮助电子爱好者打造专业级录音设备,实现免驱动即插即用功能。
数据结构(C语言版 严蔚敏著)——数组和广义表
这一章只要理解,不作深入要求 数组顺序存储结构以及一些操作 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #define MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct { ElemType *base; //数组元素...
Python大数据舆情分析系统开发实战
舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。
广义表的建立与一般操作C\C++
广义表的建立与一般操作C\C++ 一、广义表的概念 广义表是线性表的推广,但线性表的元素仅限于原子项,原子作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限制,允许它们具有自身独立类型结构,就产生了广义表的概念。 广义表是n(n>=0)个数据元素a1,a2,......ai,......,an的有序序列,一般记作:
ArcMap 10.7/10.8启动加载界面后闪退?可能是这个隐藏的Normal.mxt模板文件在搞鬼
本文深入分析了ArcMap 10.7/10.8启动加载界面后闪退的问题,指出Normal.mxt模板文件损坏是常见原因。提供了从定位、删除模板文件到系统级修复的完整解决方案,帮助GIS工程师快速恢复工作流程。
告别C盘爆红!手把手教你将WSL2下的Ubuntu 22.04完整迁移到D盘(附清理指南)
本文详细指导如何将WSL2下的Ubuntu 22.04从C盘无损迁移到D盘,包括导出备份、注销原系统、导入新位置等关键步骤,并提供迁移后的优化配置、开发环境衔接及长期维护技巧,帮助用户彻底解决C盘空间不足问题。
数组和广义表 讲义实现
一般都是采用顺序存储的方式来表示数组。 两种顺序储存方式 以行序为主序存储 以列序为主序储存 无论是行优先还是列优先 开始节点的存放地址 维数和每维的上下界 每个数组元素所占用的空间数 多维数组时 行优先:从右到左 列优先:从左到右 矩阵的压缩存储 为多个相同的非零元素只分配一个存储空间,对零元素不分配空间。 对称矩阵 三角矩阵 对角矩阵 稀疏矩阵 template &lt;c...
CTF入门RSA维纳攻击
RSA维纳攻击 一.题目描述 适用于e过大或国过小情况下的RSA加密 题干如下: #coding:utf-8 import gmpy2 import libnum e = 54856417509806712596137531985117125938559627187663765776152288580865785539464797248184444737659643755765127505761012086539564616967122137525108154121304264697865568653100
C语言版数据结构(从0开始) 6.数组和广义表
1.数组的定义 2.数组的顺序表示与实现 3.矩阵的压缩存储 3.1特殊矩阵 3.2稀疏矩阵
51、基于深度卷积神经网络的自闭症分类研究
本研究提出了一种基于深度卷积神经网络的自闭症分类方法,通过融合VGGNet-19和ResNet-52模型的特征,并在决策层采用SVM分类器,实现了对自闭症谱系障碍(ASD)和典型发育(TD)个体的准确区分。研究使用ABIDE数据集,结合数据增强和特征拼接技术,取得了88.12%的分类准确率和0.88的ROC曲线下面积。结果表明,该方法在自闭症自动诊断中具有良好的性能,同时研究也探讨了其局限性,并展望了未来改进方向,如多模态数据融合、迁移学习和模型可解释性的提升。
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
数据结构 【实验6 数组的建立和使用】
实验6 数组的建立和使用 实验目的 1.掌握C语言中数组的类型定义。 2.掌握数组的建立和使用的特点。 实验内容 程序1 在计算机上以字符串的形式输入了两个任意长的整数,编写求这两个整数的积的程序。 程序2 若矩阵Am´n中的某个元素aij是第i行的最小值,同时又是第j列中的最大值,则称此元素为该矩阵中的一个马鞍点。假设以二维数组存储矩阵Am´n,试编写求出矩阵中所有马鞍点的算法...
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
多维数组和广义表(C++)
线性表、栈、队列和串都是线性表的数据结构,他们的逻辑结构特征是:每个数据元素之多有一个直接前趋和直接后继。对于多维数组和广义表是一种复杂的非线性结构,它们的逻辑特征是:一个元素可能有多个直接前趋和多个直接后继。 一、数组概念 一维数组 可以看成是一个线性表或一个向量,在计算机中是一段连续的存储单元,适用于随机查找。 二维数组 由图可以知道,每个元素最多由两个直接前驱和两个直接后继(边...
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
【数据结构学习记录12】——多维数组的顺序实现
多维数组的顺序实现一.前言二.数组的结构再探1.降维2.下标计算3.名词解释三.实现原理1.数组的结构2.数组的初始化3.数组的取地址4.数组的取值与修改四.代码实现1.stdarg.h1.1 va_list1.2 va_start()1.3 va_arg()1.4 va_end()1.6 样例代码2.主代码 一.前言 对于数组,我们大家肯定不陌生。单维数组肯定很熟悉,那多维数组呢?实际上就是多个单维数组所构成的特殊的数组的数组。这一内容,在C++的文章里也提到过。那么,我们如何通过用线性结构来模拟一个多维
【数据结构】数组和广义表
一、数组的定义 1、数组的定义和基本运算 (1)数组的特点是每个数据元素可以又是一个线性表结构 (2)因此,数组结构可以简单定义为:若线性表中的数据元素(不可再分的原子结构),则称为一维数组,即为向量。 (3)若一维数组中的数据元素又是一个一维数组结构,则称为二维数组。 (4)依此类推,若二维数组中的元素又是一个一维数组结构,则称作三维数组。 (5)数组与线性表的区别与联系: 相同之处:它们都是若干个相同数据类型的数据元素a0,a1,a2.......an-1构成的有限序列。 不同之处: ·
数据结构学习-数组和广义表
问题描述:假设n*n的稀疏矩阵A采用三元组表示,设计一个程序实现如下功能: 1.生成如下2个稀疏矩阵的三元组a和b; ⎡ ⎣ ⎢ ⎢ ⎢ 1000 0100 3011 0001 ⎤ ⎦ ⎥ ⎥ ⎥ ⎡ ⎣ ⎢ ⎢ ⎢ 3000 0400 0010 0002 ⎤ ⎦ ⎥ ⎥ ⎥ \left[ \begin{array}{cccc} 1&0&3&0\\
数据结构的学习_4.1 多维数组和运算
4.1 多维数组和运算 4.1.1 数组的顺序存储 数组在各种高级语言中通常有两种不同的顺序存储方式,C语言是按行优先顺序存储的 (1)按行优先顺序存储,即将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。 A的m * n 个元素按行优先顺序存储的线性序列为 a00,a01,...,a0n−1,a10,a11,...,a1n−1,...,am−10,am−11,...,am−1n−1 a_{00},a_{01},...,a_{0n-1},a_{10},a_{11},...,a_{1n-
数组的顺序表示和实现【严蔚敏】
代码为数据结构【严蔚敏】书籍配套纯c代码 //数组的顺序存储表示 #include // 标准头文件,提供宏va_start,va_arg和va_end, // 用于存取变长参数表 struct Array { ElemType *base; // 数组元素基址,由InitArray分配 int dim; // 数组维数 i
数据结构---数组的基本操作
一、面向过程的数组应用 public class ArrayApp { public static void main(String[] args) { long [] arry;//声明数组 arry=new long[100];//创建数组 int element=0;//元素个数 int j; long searchkey;//查找的数字 ...
数组和广义表的操作(课堂笔记)
一、矩阵的压缩存储 对称矩阵:对有n^2个元素的对称矩阵,可用长度为 [n(n+1)/2] 的一维矩阵存储。以行序为主序,存储下三角中的元: 当i >= j时, k = i(i-1)/2+j-1; 当i < j时,k = j(j-1)/2+i-1; 稀疏矩阵 (1)三...
r语言列表添加元素_【R语言新书】1.2 数据结构Ⅰ:向量、矩阵、多维数组
张敬信:我的R语言新书信息汇总zhuanlan.zhihu.com数据结构是为了便于存储不同类型的数据而设计的数据容器。学习数据结构,就是要把各个数据容器的特点、适合存取什么样的数据理解透彻,只有这样才能在实际中选择最佳的数据容器,数据容器选择的合适与否,直接关系到代码是否高效简洁,甚至能否解决问题。R 中常用的数据结构可划分为:同质数据类型(homogeneous),即所存储的一定是相同类型的...
2300



被折叠的 条评论
为什么被折叠?



