同时具备数组和链表的优点的数据结构是:动态数组。动态数组可以根据需要动态地增加或减少数组的大小,因此它具有数组的随机访问特性。同时,动态数组还可以在数组末尾快速添加或删除元素,这一点类似于链表操作,因此它也具有链表的灵活性。
一种同时具备数组和链表优点的数据结构是动态数组(Dynamic Array),也被称为可扩展数组(Resizable Array)。动态数组在底层使用的是数组,但是它可以根据需要动态地增加或减少数组的大小,因此它具有数组的随机访问特性。
同时,动态数组还可以在数组末尾快速添加或删除元素,这一点类似于链表操作,因此它也具有链表的灵活性。因此,动态数组既可以支持高效随机访问,又可以在需要时动态改变其大小,方便地进行插入、删除等操作,是一种非常实用的数据结构。在很多编程语言和标准库中都已经提供了动态数组的实现。
在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。
在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
遵循原则:
构建所需指针:
构建所需函数:
说明:
malloc与calloc的区别:
对于用malloc分配的内存区间,如果原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题,因此在使用它之前必须先进行初始化(可用memset函数对其初始化为0),但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。 当你在calloc()函数和malloc()函数之间作选择时,你需考虑是否要初始化所分配的内存空间,从而来选择相应的函数。
具体构建方法:
以三维整型数组array[n1][n2][n3]为例。
先遵循从外层到里层,逐层申请的原则:
最外层指针是array,它是个三维指针,所指向的是array[],其为二维指针。所以给array申请内存应:
array=(int***)calloc(n1,sizeof(int**));
次层指针是array[],它是个二维指针,所指向的是array[][],其为一维指针。所以给array[]申请内存应:
for(i=0;i<n1;i++) { array[i]=(int**)calloc(n2,sizeof(int*)); }
最内层指针是array[][],它是个一维指针,所指向的是array[][][],其是个整型常量。所以给array[][]申请内存应:
for(i=0;i<n1;i++) { for(j=0;j<n2;j++) { array[i][j]=(int*)calloc(n3,sizeof(int)); } }
当然,你可以把它们整合在一起为:
int i,j,k; int n1,n2,n3; int ***array; scanf("%d%d%d",&n1,&n2,&n3); array=(int***)calloc(n1,sizeof(int**)); for(i=0;i<n1;i++) { array[i]=(int**)calloc(n2,sizeof(int*)); for(j=0;j<n2;j++) { array[i][j]=(int*)calloc(n3,sizeof(int)); for(k=0;k<n3;k++) { array[i][j][k]=i+j+k+1; } } }
最后不要忘了释放这些内存,这要遵循释放的时候从里层往外层,逐层释放的原则:
for(i=0;i<n1;i++) { for(j=0;j<n2;j++) { free(array[i][j]);//释放第三维指针 } } for(i=0;i<n1;i++) { free(array[i]);//释放第二维指针 } free(array);//释放名列前茅维指针
延伸阅读1:数组与链表的优点有哪些
数组的优点:
链表的优点:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系邮箱:hopper@cornerstone365.cn 处理,核实后本网站将在24小时内删除。