在实现图操作的时候,因为用邻接矩阵法实现,所以就用到二维数组,而在这里,就着重说下怎么样动态申请二维数组,它的原理是:
申请完毕后,就类似于在一个一维数组中,每一个元素都为一个指针,而这个指针正好指向一个一维数组(或者说就是这个一维数组的首地址):
当然,动态申请二维数组和动态申请二级指针内存是一个道理,其实从动态申请二级指针也可以试着延伸到动态申请三级指针,甚至到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; }