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

C语言多维数组数据结构怎么实现

2023-06-25 21:06:38 130人浏览 泡泡鱼
摘要

这篇文章主要介绍“C语言多维数组数据结构怎么实现”,在日常操作中,相信很多人在C语言多维数组数据结构怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言多维数组数据结构怎么实现”的疑惑有所帮助!接下来

这篇文章主要介绍“C语言多维数组数据结构怎么实现”,在日常操作中,相信很多人在C语言多维数组数据结构怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言多维数组数据结构怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    数据结构之多维数组

    定义结构体

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

    各基本操作函数原型说明

    (1)创建数组

    //若函数参数合法,则构建数组AStatus 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的元素总数elemtotalint 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。

    测试代码:

    C语言多维数组数据结构怎么实现

    运行结果:

    C语言多维数组数据结构怎么实现

    销毁

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

    测试代码:

    C语言多维数组数据结构怎么实现

    运行结果:

    C语言多维数组数据结构怎么实现

    数组元素赋值

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

    测试代码:

    C语言多维数组数据结构怎么实现

    运行结果:

    C语言多维数组数据结构怎么实现

    取出数组元素

    测试代码:

    C语言多维数组数据结构怎么实现

    运行结果:

    C语言多维数组数据结构怎么实现

    思考与小结

    1、 对数组的再认识

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

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

    两次编译报错

    ①错误信息: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 中引用了该符号

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

    运行时报错

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

    运行结果出错

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

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

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

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

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

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

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

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

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

    到此,关于“C语言多维数组数据结构怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: C语言多维数组数据结构怎么实现

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

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

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

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

    下载Word文档
    猜你喜欢
    • C语言多维数组数据结构怎么实现
      这篇文章主要介绍“C语言多维数组数据结构怎么实现”,在日常操作中,相信很多人在C语言多维数组数据结构怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言多维数组数据结构怎么实现”的疑惑有所帮助!接下来...
      99+
      2023-06-25
    • C语言多维数组数据结构的实现详解
      目录数据结构之多维数组各基本操作函数原型说明 各基本操作的具体实现测试分析思考与小结1、 对数组的再认识2、调试过程中遇到的问题及解决方案3、算法的时间复杂度分析总结数据结构之多维数...
      99+
      2024-04-02
    • 怎么在C语言中使用多维数组和结构体
      本篇内容介绍了“怎么在C语言中使用多维数组和结构体”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目:有一个颜色集合,里面有若干个颜色值(R...
      99+
      2023-06-08
    • C语言新手练习之多维数组、结构体及函数
      1887 颜色精简 题目: 有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现在有若干个颜色值需要映射到集合中的某个值。具体的映射方法是找到集合中和它的颜色距离最小的进行映射。...
      99+
      2024-04-02
    • 如何在C语言中使用多维数组和结构体
      如何在C语言中使用多维数组和结构体?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1887 颜色精简题目:有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现...
      99+
      2023-06-15
    • C语言数据结构之单链表怎么实现
      本文小编为大家详细介绍“C语言数据结构之单链表怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构之单链表怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.为什么使用链表在学习链表以前,...
      99+
      2023-07-02
    • 数据结构——栈(C语言)
      需求:无 栈的概念: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端为栈底。栈中的数据元素遵守后进先出(LIFO)原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈...
      99+
      2023-09-04
      数据结构 c语言 经验分享
    • c语言数据结构怎么使用
      在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
      99+
      2024-03-01
      c语言
    • c语言数据结构是什么
      c语言数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。C语言是...
      99+
      2023-08-09
    • C语言的数据结构怎么理解
      这篇文章主要介绍了C语言的数据结构怎么理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言的数据结构怎么理解文章都会有所收获,下面我们一起来看看吧。1 猜数字游戏-问题描述这个游戏一点都不陌生,猜价格是一度...
      99+
      2023-06-30
    • C语言数据结构之队列怎么定义与实现
      今天小编给大家分享一下C语言数据结构之队列怎么定义与实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、队列的性质上次我们...
      99+
      2023-07-02
    • 数据结构C语言链表的实现介绍
      目录前言函数1. 链表初始化2. 计算链表长度3. 打印链表4.计算链表长度5. 删除链表中指定位置节点6. 向链表中指定位置插入节点7. 全代码+运行效果前言 需要用到的函数库 ...
      99+
      2024-04-02
    • C语言数据结构顺序表怎么构造
      本篇内容介绍了“C语言数据结构顺序表怎么构造”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在学习链表之前先掌握顺序表什么是顺序表?顺序表...
      99+
      2023-06-30
    • C利用语言实现数据结构之队列
      目录一、链队列二、链队的表示三、链队的基本操作1. 链队的初始化2. 链队的销毁3. 入队4. 出队四、顺序队列五、循环队列1. 初始化2. 求队列长度3. 入队4. 出队 前言: ...
      99+
      2024-04-02
    • C语言数据结构之单链表的实现
      目录一.为什么使用链表二.链表的概念三.链表的实现3.1 创建链表前须知3.2 定义结构体3.3 申请一个节点3.4 链表的头插3.5 链表的尾插3.6 链表的尾删3.7 链表的头删...
      99+
      2024-04-02
    • c语言怎么输入多组数据
      在 C 语言中,输入多组数据可以通过使用循环结构来实现。以下是一个示例代码,演示了如何输入多组数据: #include <st...
      99+
      2024-04-02
    • C语言 数据结构之数组模拟实现顺序表流程详解
      目录线性表和顺序表线性表顺序表静态顺序表动态顺序表代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(line...
      99+
      2024-04-02
    • 数据结构:链表(Python语言实现)
      链表分为单链表、双链表、循环单链表和循环双链表。 本文以单链表为例,用python创建一个单链表数据结构,同时定义链表节点的增加、删除、查询和打印操作。 一、创建节点类 创建一个名为Node的节点类,节点类里面包含2个属性和1个方法。...
      99+
      2023-09-24
      链表 数据结构 python 算法 Powered by 金山文档
    • C语言数据结构之栈与队列怎么相互实现
      本篇内容介绍了“C语言数据结构之栈与队列怎么相互实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、用对列实现栈题干要求:细节分析:队列是...
      99+
      2023-07-02
    • C语言数据结构中单向环形链表怎么实现
      这篇“C语言数据结构中单向环形链表怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言数据结构中单向环形链表怎么实现...
      99+
      2023-06-29
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作