一步一步学数据结构之(动态申请二维数组)

在实现图操作的时候,因为用邻接矩阵法实现,所以就用到二维数组,而在这里,就着重说下怎么样动态申请二维数组,它的原理是:

申请完毕后,就类似于在一个一维数组中,每一个元素都为一个指针,而这个指针正好指向一个一维数组(或者说就是这个一维数组的首地址):

当然,动态申请二维数组和动态申请二级指针内存是一个道理,其实从动态申请二级指针也可以试着延伸到动态申请三级指针,甚至到n级指针。

现在截取下邻接矩阵法实现图时,创建矩阵的代码,以供参考:

MGraph* MGraph_Create(MVertex** v, int n)
{
	TMGraph* ret = NULL;
	
	if((NULL!=v) && (0<n))
	{
		ret = (TMGraph*)malloc(sizeof(TMGraph));
		
		if(NULL != ret)
		{
			int* p = NULL;
			
			ret->count = n;
			//通过二级指针动态申请一维指针数组 
			ret->v = (MVertex**)malloc(sizeof(MVertex*) * n);
			ret->matrix = (int**)malloc(sizeof(int*) * n);
			
			//通过一级指针申请数据空间
			//calloc函数把申请的数据空间全清0 
			p = (int*)calloc(n * n, sizeof(int));
			
			if((NULL!=ret->v) && (NULL!=ret->matrix) && (NULL!=p))
			{
				int i = 0;
				
				for(i=0; i<n; i++)
				{//把指针数组和数据空间连接起来 
					ret->v[i] = v[i];
					ret->matrix[i] = p + i* n;
				}	
			}
			else
			{
				free(ret->v);
				free(ret->matrix);
				free(p);
				free(ret);
				
				ret = NULL;	
			}	
		}
	}
	
	return ret;
}

原文地址:https://www.cnblogs.com/keanuyaoo/p/3265442.html