iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言多维数组数据结构的实现详解
  • 798
分享到

C语言多维数组数据结构的实现详解

2024-04-02 19:04:59 798人浏览 独家记忆
摘要

目录数据结构之多维数组各基本操作函数原型说明 各基本操作的具体实现测试分析思考与小结1、 对数组的再认识2、调试过程中遇到的问题及解决方案3、算法的时间复杂度分析总结数据结构之多维数

数据结构之多维数组

定义结构体


typedef struct {

	ElemType* base;//数组元素基址(数组基址)
	int dim;//数组维数
	int* bounds;//数组维界基址(存放各位长度信息)
	int* constants;//数组映象函数常量基址
}Array;

各基本操作函数原型说明

(1)创建数组


//若函数参数合法,则构建数组A
Status InitArray(Array* A, int dim, ...);

(2)销毁数组


//销毁数组
Status DestroyArray(Array* A);

(3)数组的定位


//获取元素位置(数组定位)
Status LocateArray(Array A, va_list ap, int* offset);

(4)数组元素的赋值


//A为n维数组,e为元素变量,随后是n个下标值
//若下标不超界,则将e的值赋给所指定的A的元素(赋值)
Status SetArray(Array* A, ElemType e, ...);

(5)获取数组元素


//A为n维数组,e为元素变量,随后是n个下标值
//若下标不超界,则将e赋值为所指定的A的元素(获取)
Status GetValue(ElemType* e, Array A, ...);

各基本操作的具体实现

(1)创建数组函数实现


//创建多维数组
Status InitArray(Array* A, int dim, ...) {
	if (dim <1 || dim>MAX_ARRAY_DIM) return ERROR;//参数不合法
	A->dim = dim;
	A->bounds = (int*)malloc(sizeof(int) * dim);
	if (!A->bounds) return OVERFLOW;//分配内存失败
	//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
	int elemtotal = 1;
	va_list ap;
	va_start(ap, dim);
	for (int 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);
	//为数组分配内存空间内
	A->base = (ElemType*)malloc(sizeof(ElemType) * elemtotal);
	if (!A->base) return OVERFLOW;//分配内存失败
	//求映像函数Ci,并存入A.constants[i-1],i = 1,...,dim;
	A->constants = (int*)malloc(sizeof(int) * dim);
	if (!A->constants) return OVERFLOW;//分配内存失败
	A->constants[dim - 1] = 1;
	for (int i = dim - 2; i >= 0; --i) {
		A->constants[i] = A->bounds[i + 1] * A->constants[i + 1];
	} 
	return OK;
}

(2)销毁数组函数实现


//销毁数组
Status DestroyArray(Array* 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;
}

(3)数组定位函数实现


//数组的定位
Status LocateArray(Array A, va_list ap, int* offset) {
	int i, instand;
	//若ap指示的元素下标合理,则求出元素相对位置,返回到offset
	*offset = 0;
	for (i = 0; i < A.dim; i++) {
		instand = va_arg(ap, int);
		if (instand < 0 || instand > A.bounds[i]) {
		//	printf("instand = %d,定位失败\n",instand);//调试代码
			return ERROR;
		}
		*offset += A.constants[i] * instand;
	}
	return  OK;
}

(4)数组元素赋值函数实现


//数组赋值
Status SetArray(Array *A, ElemType e, ...) {
	va_list ap;
	int offset;
	va_start(ap, e);
	if (LocateArray(*A, ap, &offset) == ERROR) return ERROR;
	va_end(ap); 
	*(A->base + offset) = e;
	return OK;
}

(5)取出数组元素函数实现


//获取数组元素的值,并用E返回
Status GetValue(ElemType* e, Array A, ...) {
	va_list ap;
	int offset;
	va_start(ap, A);
	if (LocateArray(A, ap, &offset) == ERROR) return ERROR;
	va_end(ap);
	*e = *(A.base + offset);
	return OK;
}

测试分析

创建

创建一个二维数组,其第一维长度为4,第二维长度为3。

测试代码:

运行结果:

销毁

将结构体A的地址传入到DestroyArray函数中,执行操作。

测试代码:

运行结果:

数组元素赋值

定义二维数组B[4][3],通过SetArray函数将其值赋给数组A,通过遍历输出A中元素的值,则可以判断出赋值是否准确。

测试代码:

运行结果:

取出数组元素

测试代码:

运行结果:

思考与小结

1、 对数组的再认识

存储器的结构是一维线性的结构,数组是多维的结构。如果要将一个多维的结构放在一个一维的存储单元里,就必须先将多维的数组转换成一个一维的线性序列,才能将其放在存储器当中。数组的存储方式主要有两种:一张是以行序为主的存储方式,另外一种是以列序为主的存储方式。

2、调试过程中遇到的问题及解决方案

1、两次编译报错

①错误信息:va_start argument must not have reference type and must not be parenthesized;

va_start函数的运用问题,函数原型:void va_start(va_list ap,parmN);报错原因为参数不正确。查看C语言开发手册,得出原因。

ap 一个va_list类型的实例

Prmhn 第一个变量参数前的命名参数

②错误信息:*LNK2019 无法解析的外部符号 "int __cdecl SetArray(struct Array ,int,int,…)" (?SetArray@@YAHPAUArray@@HHZZ),函数 _main 中引用了该符号

此错误信息为,找的到定义却又未找到实现的函数,故需将函数实现后才能调用,同时注意参数的对应,避免出现以上问题。

2、运行时报错

运行时报错,数据访问出现问题。通过检查报错信息的前后语句,发现在访问数组的时候忘记i+1,导致i走到-1形成错误原因。

3、运行结果出错

运行结果出现了地址与数值都输出的情况,通过调试,发现第一次进入LocateArray函数之后,函数返回了ERROR,通过打印语句检查,函数确实进入了判断语句内,返回ERROR;

表明参数不准确或者函数判断语句不正确,由于数值为自己控制的,故参数不准确的可能性较小,仔细分析了参数临界以及函数逻辑,将判断参数的条件改成正确判断语句。得到正确的结果。

3、算法的时间复杂度分析

InitArray函数的时间复杂度为O(n);

DestroyArray函数的时间复杂度为O(1);

LocateArray函数的时间复杂度为O(n);

SetArray函数的时间复杂度为O(n);

GetArray函数的时间复杂度为O(n);

SetArray函数和GetArray函数的时间复杂度主要受LocateArray函数影响。

总结

到此这篇关于C语言多维数组数据结构实现的文章就介绍到这了,更多相关C语言多维数组数据结构内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言多维数组数据结构的实现详解

本文链接: https://www.lsjlt.com/news/159703.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言多维数组数据结构的实现详解
    目录数据结构之多维数组各基本操作函数原型说明 各基本操作的具体实现测试分析思考与小结1、 对数组的再认识2、调试过程中遇到的问题及解决方案3、算法的时间复杂度分析总结数据结构之多维数...
    99+
    2022-11-12
  • C语言多维数组数据结构怎么实现
    这篇文章主要介绍“C语言多维数组数据结构怎么实现”,在日常操作中,相信很多人在C语言多维数组数据结构怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言多维数组数据结构怎么实现”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • 详解C语言数据结构之栈
    目录栈的链式实现主要内容代码实现:总结栈的链式实现 主要内容 (1) 栈包含7个元素,依次是67,3,88,6,1,7,0,采用尾插入法创建 栈,为该栈设置两个指针,一个bottom...
    99+
    2022-11-12
  • C语言详细讲解多维数组与多维指针
    目录一、指向指针的指针二、二维数组与二维指针三、数组名四、小结一、指向指针的指针 指针的本质是变量 指针会占用一定的内存空间 可以定义指针的指针来保存指针变量的地址值 为什么需要指向...
    99+
    2022-11-13
  • C语言 数据结构之数组模拟实现顺序表流程详解
    目录线性表和顺序表线性表顺序表静态顺序表动态顺序表代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(line...
    99+
    2022-11-12
  • C语言数据结构哈希表详解
    #include <stdio.h> #include <stdlib.h> #include <string.h> // 哈...
    99+
    2022-11-13
  • C语言新手练习之多维数组、结构体及函数
    1887 颜色精简 题目: 有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现在有若干个颜色值需要映射到集合中的某个值。具体的映射方法是找到集合中和它的颜色距离最小的进行映射。...
    99+
    2022-11-12
  • 如何在C语言中使用多维数组和结构体
    如何在C语言中使用多维数组和结构体?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1887 颜色精简题目:有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现...
    99+
    2023-06-15
  • 怎么在C语言中使用多维数组和结构体
    本篇内容介绍了“怎么在C语言中使用多维数组和结构体”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目:有一个颜色集合,里面有若干个颜色值(R...
    99+
    2023-06-08
  • C语言数据结构之堆排序详解
    目录1.堆的概念及结构2.堆的实现2.1 堆的向下调整算法2.2 堆的向上调整算法2.3 建堆(数组)2.4 堆排序2.5 堆排序的时间复杂度1.堆的概念及结构 如果有一个关键码的集...
    99+
    2022-11-13
  • C语言数据结构之二叉树详解
    目录1. 树概念及结构1.1树概念1.2树的表示2. 二叉树概念及结构2.1概念2.2数据结构中的二叉树2.3特殊的二叉树2.4二叉树的存储结构2.5二叉树的性质3. 二叉树顺序结构...
    99+
    2022-11-13
  • C语言数据结构与算法之队列的实现详解
    目录队列的概念及结构队列的实现Queue.hQueue.cTest.c队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FI...
    99+
    2022-11-13
    C语言数据结构 队列 C语言 队列实现 C语言 队列
  • C语言结构体数组的定义和使用详解
    目录介绍结构体数组定义时初始化补充介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗...
    99+
    2022-11-12
  • C语言数据结构之队列算法详解
    目录一、前言二、基本概念三、顺序队列四、链队列五、循环队列六、总结与提高一、前言 队列在程序设计中经常出现,如:操作系统中的排队问题。 这篇文章主要介绍了队列的...
    99+
    2022-11-12
  • C语言数据结构不挂科指南之栈&队列&数组详解
    目录学习目标栈基本概念栈的基本运算栈的顺序实现双栈栈的链接实现考试要点小结学习目标 自考重点、期末考试必过指南,这篇文章让你理解什么是栈、什么是队列、什么是数组 掌握栈、队列的顺序存...
    99+
    2022-11-13
  • R语言数据结构之矩阵、数组与数据框详解
    目录前言一、矩阵(matrix)1.1矩阵的创建:1.2访问矩阵的数据:1.3矩阵的运算:二、数组(array)2.1数组的创建:2.2访问数组的数据:三、数据框3.1数据框的创建:...
    99+
    2022-11-13
  • Java数据结构实现二维数组与稀疏数组转换详解
    基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值(0除外)。 ②把具有...
    99+
    2022-11-12
  • C语言 深入解读数据结构之堆的实现
    堆的概念与结构 概念:如果有一个关键码的集合K={ k0,k1 ,k2 ,…,kn-1 },把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足K i<=K ...
    99+
    2022-11-12
  • 详解C语言结构体中的char数组如何赋值
    目录前景提示一.char数组类型的处理1.结构体初始化2.结构体内数据赋值(简单法)二.char数组指针类型的处理1.结构体初始化2.结构体内数据赋值3.结构体内输出数据三.全部代码...
    99+
    2022-11-13
  • C语言数据结构实例讲解单链表的实现
    目录1、单链表2、单链表的实现头文件函数的实现(1)打印链表(2)动态申请结点(3)尾插(4)头插(5)尾删(6)头删(7)查找(8)在pos之前插入(9)删除pos(10)在pos...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作