一维数组存储缺点,使用一维数组有哪些优势
一、C语言怎么用指针代替二维数组
1.设p是指向二维数组a[m][n]的指针变量,则有:
int* p=a[0];//此时P是指向一维数组的指针。P++后,p指向 a[0][1]。
2.如果定义int(*p1)[n];p1=a;p1++后,p1指向a[1][0];
则p+j将指向a[0]数组中的元素a[0][j]。
由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+i*N+j,相应的如果用p1来表示,则为*(p1+i)+j。
元素a[i][j]相应的指针表示为:
*( p+i*N+j),相应的如果用p1来表示,则为*(*(p1+i)+j)。
同样,a[i][j]也可使用指针下标法表示,如p[i*N+j]。
若有:
int*p=a[0];
则数组a的元素a[1][2]对应的指针为:p+1*4+2
元素a[1][2]也就可以表示为:*( p+1*4+2)
用下标表示法,a[1][2]表示为:p[1*4+2]
扩展资料:
指针与数组的关系:
1.指针数组:就是一个由指针组成的数组,那个数组的各个元素都是指针,指向某个内存地址。char*p[10];//p是一个指针数组
2.数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是一个常数。
example:
char(*p)[10];//p是一个数组指针
3.函数指针:本身是一个指针,指向一个函数入口地址,通过该指针可调用其指向的函数,使用函数指针可实现回调函数。
参考资料:
百度百科-指针
二、树的存储形式
树的存储形式如下:
树的存储形式有双亲表示法、孩子表示法、孩子兄弟表示法。双亲表示法的特点:由于根结点是没有双亲的,约定根结点的位置位置域为-1。
根据结点的parent指针很容易找到它的双亲结点。所用时间复杂度为0(1),直到paren为-1时,表示找到了树结点的根。缺点:如果要找到孩子结点,需要遍历整个结构才行。
孩子表示法定义:把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。
双亲孩子表示法定义:对于孩子表示法,查找某个结点的某个孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。但是当要寻找某个结点的双亲时,就不是那么方便了。所以可以将双亲表示法和孩子表示法结合形成双亲孩子表示法。
优缺点:
双亲表示法:该种方法寻找一个节点的双亲结点比较方便,但是对于寻找一个节点的孩子节点*作实现却不太方便。
孩子表示法:该方法寻找一个节点的孩子节点*作比较方便,但是寻找一个结点的双亲结点就比较麻烦了。
双亲孩子表示法:该存储结构具有双亲表示法和孩子表示法两种存储结构优点,到*作实现比较麻烦。
孩子兄弟表示法:该存储结构其实就是把树转换为一个二叉树的形式去存储,实现比较方便。
三、使用一维数组有哪些优势
1、数组,顾名思义,是相同类型的数组成的一个组,也就是说是把相同类型的一系列数据统一编制到某一个组别中。这样就可以通过数组名+索引号简单快捷的*作大量数据。这就和全校学生一样,把学生分成多个班级,每个学生都是班级中的一员,如果要找张三,如果没有班级的话,就要在全校学生中一个一个寻找,一直到找到为止;但是如果引入了班级,就可以在某某班级中寻找张三,这样就更加方便快速了。
2、一般有四种数组定义方式,以一维数组为例:
//定义指定维数的数组
int arr[10];
//定义不指定维数的数组,数组维数有初化列表元素个数决定。
int arr[]={1,2,4};
//定义指定维数的数组,初始化不完全时,系统将未初始化元素初始化为0
int arr[10]={1,2};
//动态分配一个数组。下面分配了一个有10个元素的数组。
int*arr=(int*) malloc(10* sizeof(int));
四、设对称矩阵A压缩存储在一维数组B中
首先由 a52能够得到的信息有:
针对特殊的矩阵压缩的方式是存储下三角,而且下三角计算一维数组的下标是:k=i(i+1)/2+j
由a11存储在B[0]可以知道从1开始存储,计算时需要减1
a36位于上三角中,对应的下三角的点是a63,在根据公式就能算出下标,注意一定要找到下三角的点