利用一维数组表示一个可扩展的n*n矩阵的一种方法

1.设计背景

        之所以想了这样一个方法,是因为在写程序的时候遇到了相应的问题,为了解决而想出来的。当时需要构造并使用一个图结构来实现一些功能,我选择了用邻接矩阵和顶点列表的形式来表示一个图,而我又选择了使用一维数组来表示一个邻接矩阵。但是这里出现了问题,我们的图的顶点个数可以增加,也就是说邻接矩阵会不断增大,如果使用传统的方法用数组第n*i+j项表示矩阵中(i,j)位置的元素,当矩阵由N*N变为(N+1)*(N+1)时,这种对应关系就会被破坏。比如本来一个数组a表示3*3矩阵,那a[6]表示的是(2,0)的元素,但矩阵扩展为4*4后,a[6]变为(1,2)的元素而不是对应原来位置的(2,0)的元素,这就会带来错误。

当然,我们可以用邻接表或其他各种方式来表示图来轻松的避免这个问题,我们也可以直接建立二维数组表示邻接矩阵,但我在思考之后想了一个办法来解决上述问题,从而仍然使用一个一维数组来表示一个可以变大的n*n矩阵,也就是一个可增加顶点的图的邻接矩阵,也许某种情况下这会有一定作用,所以在此进行一下分享(当然这并不难想,可能大家都想得出来,我只是分享一下我的想法。。。)

2.实现方法

我的思路就是不再使用上述传统的方法,也就是数组第n*i+j项表示矩阵中(i,j)位置的元素,而是改变一维数组中一项数据与矩阵中一项数据的对应关系,从而实现目的,我们可以这样形象的来想,从1*1的矩阵开始,它只有一个元素,之后每次扩展都是在原来的左边的下边加一圈,那么每次扩展时,我们新增的元素按照从新添的最左的一列向下到最下一行,在向右的方法逐一填充。

这样的意义是,每次由 N*N矩阵扩展为(N+1)*(N+1)时新增提案的2N+1个元素都被排在了新增添的格子中,没有和原来的冲突。需要注意的是,我这里的填写,指的是填写对应一维数组的元素的索引值,我们应当从N*N开始,将其填到(0,N+1)这个格子,然后将这个数+1填到下面的格子,按上面箭头的顺序一直到(N+1)*(N+1)-1填到(N+1,0)这个格子结束,这就是我的基本思路,这里说的不够清晰,我会在具体描述一下。

                                 图中的数字就是对应一维数组的索引值

要记住,矩阵的虚拟的,抽象的,我们并没有实际的矩阵,我们只有一个一维数组,所谓的矩阵是由一维数组中的元素通过一一对应的方式在你的脑海中填充到特定的位置而形成的,上面这种对应方式无疑是一个一一对映,因为按这种方法构造,从0开始的N*N个数被不重复的填入了矩阵,而填入方法就是上面说过的,从1*1开始,每扩展一次,就从上至下,再从右至左写。

        这种从实际存储的一维数组到虚拟的二维矩阵的关系是可以数学表示的,因为我们的需求都是给定了矩阵中的某个元素,所以这里给出的就是(i,j)元素怎样在一维数组中寻找其索引k:

        若 i <= j    则  k = j * j + i

        若 i > j    则  k = i * i + 2* i - j

        这是根据规律总结出来的,具体数学原理就不说了。

3.总结

        总之这是一种可行的用一维数组来表示可扩展的N*N矩阵的方法,但这种方法我目前还没想到怎么实现边长的减小,也就是说如果用这种方法表示图的邻接矩阵,图的顶点没法删除,这个问题目前我还没想到怎样解决,较为可惜。这并不是什么困难的方法,只是我自己想到后分享一下,希望对别人有所帮助。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 信捷PLC(可编程逻辑控制器)在C语言中使用数组时具有以下特点: 1. 数组是一种用于存储相同数据类型的多个元素的连续存储空间。在C语言中,数组的长度在声明时需要指定,并且长度是固定的。 2. 在信捷PLC的C语言中,数组的声明和使用遵循标准的C语言语法。例如,可以使用以下语法来声明一个整数数组: int array[5]; 3. 数组的元素在内存中是连续存储的,通过数组名和索引可以访问数组中的特定元素。索引从0开始,因此上述数组中的第一个元素可以通过array[0]来访问。 4. 信捷PLC的C语言中,可以使用循环结构来遍历数组,方便处理数组中的多个元素。例如,可以使用for循环来遍历上述数组,如下所示: for(int i = 0; i < 5; i++){ //访问数组元素,并进行相应操作 } 5. 数组的长度在编译时需要确定,在运行时无法动态修改。因此,在使用数组时需要确保不越界访问数组的元素,以防止内存错误和程序崩溃。 6. 数组可以用于存储各种数据类型的元素,例如整数、浮点数、字符等。在声明数组时,需要指定元素的数据类型。 总而言之,信捷PLC在C语言中使用数组时需要声明数组长度,并且数组元素在内存中是连续存储的。数组的使用可以通过循环结构方便地遍历和处理多个元素。在使用数组时需要注意数组越界访问的问题。 ### 回答2: 信捷 PLC 是一种专用于工业控制的可编程逻辑控制器。它使用的编程语言主要是 C 语言。 在信捷 PLC 中,C 语言的数组是一种数据结构,用于存储多个相同类型的元素。数组的好处是可以通过一个索引访问和操作其中的元素。 在 C 语言中,数组的声明和初始化可以分为两步。首先需要声明数组的类型和名称,然后使用方括号指定数组的大小。例如,int 类型的整数数组可以声明为 int array[10],表示有 10 个整数的数组。 信捷 PLC 的 C 语言数组支持各种数据类型,包括整数、浮点数、字符等。数组的元素可以通过索引来访问和修改。数组的索引从 0 开始,即第一个元素的索引为 0,第二个元素的索引为 1,以此类推。 使用数组,可以通过循环结构来处理数组中的元素,实现批量的数据处理。例如,可以使用 for 循环遍历数组中的所有元素,并进行相应的处理。 除了一维数组,C 语言还支持多维数组。多维数组可以看作是一维数组扩展,可以用来表示更复杂的数据结构,例如二维表格或多维矩阵。 总之,信捷 PLC 的 C 语言数组是一种强大的数据结构,可以用于存储和处理多个相同类型的元素。通过灵活运用数组,可以实现各种复杂的控制逻辑和数据处理操作。 ### 回答3: 信捷PLC C语言中的数组是一种用于存储多个相同类型的元素的数据结构。它可以存储整型、浮点型、字符型等各种数据类型。数组的大小在声明时就确定了,并且所有的元素都是连续存储的。 在信捷PLC C语言中,数组的声明方式为:数据类型 数组名[数组大小]。例如,声明一个整型数组可以写作:int myArray[10]。 数组的元素可以通过下标访问,下标从0开始,即第一个元素的下标为0,第二个元素下标为1,以此类推。可以使用赋值运算符将值存储到数组中的指定位置,如:myArray[0] = 10; 数组可以用于存储多个相关的数据,比如温度传感器采集的多个温度值。可以使用for循环结构遍历数组元素,对每个元素进行相应的操作。例如: ``` int temperature[5] = {25, 27, 23, 24, 28}; int sum = 0; for (int i = 0; i < 5; i++) { sum += temperature[i]; } int average = sum / 5; ``` 在上述示例中,我们声明了一个有5个元素的整型数组temperature,并给数组赋初值。然后使用for循环结构遍历数组元素,将所有元素的值相加存储到sum变量中。最后计算平均值并存储到average变量中。 总之,信捷PLC C语言中的数组是一种方便的数据结构,可以用于存储和处理大量的相关数据,提高程序的灵活性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值