資源簡介
稀疏矩陣相加、相乘和轉置(用三元組實現)
代碼片段和文件信息
#include????
#include?????
int?const?N=4;??????????????//常量??數組的大小
int?const?MaxSize=100;????//?最大?為100??常量
typedef?int?ElemType;?????//?ElemType?==?int
typedef?struct?????//結構體
{???
????int?r;??????????//行號????
????int?c;??????????//列號????
????ElemType?d;????//元素值????
}TupNode;????????//三元組定義????
typedef?struct?????//?結構體
{???
????int?rows;???//?行
????int?cols;???//?列
????int?nums;???//非零元素個數????
????TupNode?data[MaxSize];???
}TsMatrix;??????//三元組存儲結構????
???
void?CreatMat(TsMatrix?&tElemType?A[N][N])???//三元組表示稀疏矩陣????
{???
????int?ij;???
????t.rows=N;t.cols=N;t.nums=0;???//?行列賦值
????for(i=0;i ????{???
????????for(j=0;j ????????????if(A[i][j]!=0)???
????????????{???
????????????????t.data[t.nums].r=i;???//?Tsatrix中的TupNode?data[MaxSize]??從0開始儲存數組A的非零值??r?c分別存儲行列值
????????????????t.data[t.nums].c=j;???
????????????????t.data[t.nums].d=A[i][j];???
????????????????t.nums++;???
????????????}???
????}???
}???
void?DispMat(TsMatrix?t)??//輸出三元組????
{???
????int?i;???
????if(t.nums<1)???//?沒有直接返回??
????????return?;???//?有的話輸出
????printf(“\t行數:%d\t列數:%d\t非零個數:%d\n“t.rowst.colst.nums);???
????printf(“\t--------------------------\n“);???
????for(i=0;i ????????printf(“\t%d\t%d\t%d\n“t.data[i].rt.data[i].ct.data[i].d);???
}???
void?FastTranMat(TsMatrix?tTsMatrix?&tb)????????????//矩陣的快速轉置????
{???
????int?colpqsnum[N]cpot[N];???
????tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;???
????if(t.nums)??????????????????????????????????????????//?如果存在執行下面函數
????{???
??????????for(col=0;col ????????????????????????????????????????????????????????//先置t矩陣每列非0元個數均為0????
??????????for(s=0;s ????????????????????????????????????????????????????????//求t中每一列非0元個數????
????????????cpot[0]=0;???????????????????????????????????//t中第一列第一個非元在tb中的序號為1????
??????????for(col=1;col ??????????cpot[col]=cpot[col-1]+num[col-1];???
??????????????????????????????????????????????????????????//求t中第col列中第一個非0元在T中的序號????
???????????for(p=0;p ???????????{???
??????????????col=t.data[p].c;?????????????????????????????//記下t中第p個元素的列號????
???????????????q=cpot[col];???????????????????????????????//該列中第一個非0元在tb中的序號????
??????????????tb.data[q].r=t.data[p].c;???
??????????????tb.data[q].c=t.data[p].r;???
??????????????tb.data[q].d=t.data[p].d;???
??????????????++cpot[col];???
???????????}???
????}???
}???
int?MatAdd(TsMatrix?aTsMatrix?bTsMatrix?&c)????????????//?矩陣的相加
{???
????int?i=0j=0k=0;???
????ElemType?v;???
????if(a.rows!=b.rows||a.cols!=b.cols)???
????????return?0;????????????????????????????????????//行數或列數不相等時不能進行相加????
????c.rows=a.rows;c.cols=a.rows;????????????????????//c的行數和列數與a的相同????
????while(i ????{???
????????if(a.data[i].r==b.data[j].r)???
????????{???
????????????if(a.data[i]
- 上一篇:VC++旋轉風車代碼
- 下一篇:C++教程網Linux網絡編程視頻教程
評論
共有 條評論