#include<stdio.h>#include<malloc.h>typedefint elem;/**
* A triple for row index, column index, and data.
*/typedefstructTriple{int i;int j;
elem e;} Triple,*TriplePtr;/**
* A triple for row index, column index, and data.
*/typedefstructCompressedMatrix{int rows,columns,numElements;
Triple* elements;} CompressedMatrix,*CompressedMatrixPtr;/**
* Initialize a compressed matrix.
*/
CompressedMatrixPtr initCompressedMatrix(int paraRows,int paraColumns,int paraElements,int** paraData){int i;
CompressedMatrixPtr resultPtr =(CompressedMatrixPtr)malloc(sizeof(structCompressedMatrix));
resultPtr->rows = paraRows;
resultPtr->columns = paraColumns;
resultPtr->numElements = paraElements;
resultPtr->elements =(TriplePtr)malloc(paraElements *sizeof(structTriple));for(i =0; i < paraElements; i ++){
resultPtr->elements[i].i = paraData[i][0];
resultPtr->elements[i].j = paraData[i][1];
resultPtr->elements[i].e = paraData[i][2];}//Of for ireturn resultPtr;}// Of initCompressedMatrix/**
* Print the compressed matrix.
*/voidprintCompressedMatrix(CompressedMatrixPtr paraPtr){int i;for(i =0; i < paraPtr->numElements; i ++){printf("(%d, %d): %d\r\n", paraPtr->elements[i].i, paraPtr->elements[i].j, paraPtr->elements[i].e);}//Of for i}// Of printCompressedMatrix/**
* Transpose a compressed matrix.
*/
CompressedMatrixPtr transposeCompressedMatrix(CompressedMatrixPtr paraPtr){//Step 1. Allocate space.int i, tempColumn, tempPosition;int*tempColumnCounts =(int*)malloc(paraPtr->columns *sizeof(int));int*tempOffsets =(int*)malloc(paraPtr->columns *sizeof(int));for(i =0; i < paraPtr->columns; i ++){
tempColumnCounts[i]=0;}//Of for i
CompressedMatrixPtr resultPtr =(CompressedMatrixPtr)malloc(sizeof(structCompressedMatrix));
resultPtr->rows = paraPtr->columns;
resultPtr->columns = paraPtr->rows;
resultPtr->numElements = paraPtr->numElements;
resultPtr->elements =(TriplePtr)malloc(paraPtr->numElements *sizeof(structTriple));//Step 2. One scan to calculate offsets.for(i =0; i < paraPtr->numElements; i ++){
tempColumnCounts[paraPtr->elements[i].j]++;}//Of for i
tempOffsets[0]=0;for(i =1; i < paraPtr->columns; i ++){
tempOffsets[i]= tempOffsets[i -1]+ tempColumnCounts[i -1];printf("tempOffsets[%d] = %d \r\n", i, tempOffsets[i]);}//Of for i//Step 3. Another scan to fill data.for(i =0; i < paraPtr->numElements; i ++){
tempColumn = paraPtr->elements[i].j;
tempPosition = tempOffsets[tempColumn];
resultPtr->elements[tempPosition].i = paraPtr->elements[i].j;
resultPtr->elements[tempPosition].j = paraPtr->elements[i].i;
resultPtr->elements[tempPosition].e = paraPtr->elements[i].e;
tempOffsets[tempColumn]++;}//Of for ireturn resultPtr;}//Of transposeCompressedMatrix/**
* Test the compressed matrix.
*/voidcompressedMatrixTest(){
CompressedMatrixPtr tempPtr1, tempPtr2;int i, j, tempElements;//Construct the first sample matrix.
tempElements =4;int** tempMatrix1 =(int**)malloc(tempElements *sizeof(int*));for(i =0; i < tempElements; i ++){
tempMatrix1[i]=(int*)malloc(3*sizeof(int));}//Of for iint tempMatrix2[4][3]={{0,0,2},{0,2,3},{2,0,5},{2,1,6}};for(i =0; i < tempElements; i ++){for(j =0; j <3; j ++){
tempMatrix1[i][j]= tempMatrix2[i][j];}//Of for j}//Of for i
tempPtr1 =initCompressedMatrix(2,3,4, tempMatrix1);printf("After initialization.\r\n");printCompressedMatrix(tempPtr1);
tempPtr2 =transposeCompressedMatrix(tempPtr1);printf("After transpose.\r\n");printCompressedMatrix(tempPtr2);}// Of main/**
* The entrance.
*/intmain(){compressedMatrixTest();return1;}// Of main
结果如下
After initialization.(0,0):2(0,2):3(2,0):5(2,1):6
tempOffsets[1]=2
tempOffsets[2]=3
After transpose.(0,0):2(0,2):5(1,2):6(2,0):3
Press any key to continue