閱讀以下說明和C函數(shù),將應(yīng)填入(n)處的字句寫在答題紙的對(duì)應(yīng)欄內(nèi)。
【說明】
若一個(gè)矩陣中的非零元素?cái)?shù)目很少且分布沒有規(guī)律,則稱之為稀疏矩陣對(duì)丁tm行n列的稀疏矩陣M,進(jìn)行轉(zhuǎn)置運(yùn)算后得到n行m列的矩陣MT,如圖3-1所示

圖3-1稀疏矩陣M及其轉(zhuǎn)置矩陣MT
為了壓縮稀疏矩陣的存儲(chǔ)空間,用三元組(即元素所在的行號(hào)、列號(hào)和元索宜、表示稀疏矩陣中的一個(gè)非零元素,再用一維數(shù)組逐行存儲(chǔ)稀疏矩陣中的所有非零三素也稱為三元組順序表)。例如,圖3-1所示的矩陣M相應(yīng)的三元組順序表如表3-1所示.其轉(zhuǎn)置矩陣MT的三元組順序表如表3-2所示。

函數(shù)TransposeMatrix(Matrix M)的功能是對(duì)用三元組順序表表示的稀疏矩陣M進(jìn)行轉(zhuǎn)置運(yùn)算。
對(duì)M實(shí)施轉(zhuǎn)置運(yùn)算時(shí),為了將M中的每個(gè)非零元素直接存入其轉(zhuǎn)置矩陣MT三元組順序表的相應(yīng)位置,需先計(jì)算M中每一列非零元素的數(shù)目(即MT中每一行非零幾素的數(shù)目),并記錄在向量num中;然后根據(jù)以下關(guān)系,計(jì)算出矩陣M中每列的第一個(gè)非零元素在轉(zhuǎn)置矩陣MT三元組順序表中的位置:
cpot[0] = 0
cpot[j] = cpot[ j-1]+num[j-1]〕 /* j為列號(hào) */
類型ElemType, Triple和Matrix定義如下:
typedef int ElemType;
typedef struct{ /* 三元組類型 */
int r,c; /* 矩陣元素的行號(hào)、列號(hào) */
ElemType e; /* 矩陣元素的值 */
}Triple;
typedef struct{ /* 矩陣的元組三元組順序表存儲(chǔ)結(jié)構(gòu) */
int rows,cols,elements; /* 矩陣的行數(shù)、列數(shù)和非零元素?cái)?shù)目 */
Triple data[MAXSIZE]:
}Matrix;
【C函數(shù)】
int TransposeMatrix(Matrix M)
{
int j , q , t;
int *num, *cpot;
Matrix MT; /* MT是M的轉(zhuǎn)置矩陣 */
num =(int*)malloc(M.cols*sizeof(int));
cpot =(int*)malloc (M.cols*sizeof(int));
if(!num || !cpot)
return ERROR;
MT. rows = (1) ; /*設(shè)置轉(zhuǎn)置矩陣MT行數(shù)、列數(shù)和非零元數(shù)目*/
MT. cols =(2);
MT.elements = M.elements;
if (M. elements > 0){
for (q = 0 ; q < M. cols ; q++)
num[q] = 0;
for (t = 0 ; t < M. elements ; ++t ) /* 計(jì)算矩陣M中每一列非零元素?cái)?shù)目 */
num [M.data [t].c]++:
/* 計(jì)算矩陣M中每列第一個(gè)非零元素在其轉(zhuǎn)置矩陣三元組順序表中的位置 */(3) ;
for(j = 1 ; j<M. cols ; j++)
cpot[j] = (4):
/* 以下代碼完成轉(zhuǎn)置矩陣MT三元組順序表元素的設(shè)置 */
for(t = 0 ; t<M.elements ; t++){
j = (5) /* 取矩陣M的一個(gè)非零元素的列號(hào)存入j */
/*q為該非零元素在轉(zhuǎn)置矩陣MT三元組順序表中的位置(下標(biāo))*/
q = cpot[j];
MT. data[q].r = M. data[t].c;
MT. data[q].c = M. data[t].r;
MT. data[q].e = M. data[t].e;
++cpot[j]; /* 計(jì)算M中第j列的下一個(gè)非零元素的目的位置 */
}/* for */
}/* if */
free(num); free(cpot);
/* 此處輸出矩陣元素,代碼省略 */
return OK;
}/*TransposeMatrix*/