資源簡介
分別用三元組和十字鏈表兩種方法實現了稀疏矩陣的相加和相乘

代碼片段和文件信息
/*
??Name:?稀疏矩陣相加、相乘?
??Copyright:?
??Author:?宋思奇,劉磊,王沛?
??Date:?26-10-08?21:54
??Description:?第二次上機作業:?
???????????????假設稀疏矩陣A和B均以三元組表作為存儲結構,試寫出矩陣相加(相乘—選做)的算法,
???????????????另設三元組表C存放結果矩陣。
*/
#include?
#include?
//函數結果狀態碼
#define?OK????????1
#define?ERROR?????0
#define?OVERFLOW?-1?
//Status是函數的類型,其值是函數結果狀態代碼
typedef?int?Status;
//?-----?稀疏矩陣的三元組順序表存儲表示?-----
#define?MAXSIZE?100??????????????????????//假設非零元個數的最大值為100
#define?MAXRC???100
typedef?struct?{
????????int?ij;???????????????????????????//非零元的行下標和列下標
????????int?e;?????????????????????????????//非零元的值
}Triple;
typedef?struct?{
????????Triple?data[MAXSIZE?+?1];??????????//非零元三元組表,data[0]未用
????????int????rpos[MAXRC?+?1];????????????//各行的第一個非零元的位置表?
????????int????mu?nu?tu;?????????????????//矩陣的行數、列數和非零元個數?
}RLSMatrix;
Status?CreateSMatrix(RLSMatrix?*M);????????????????????????????//創建稀疏矩陣M,采用三元組存儲
Status?PrintSMatrix(RLSMatrix?M);??????????????????????????????//輸出稀疏矩陣M
Status?AddSMatrix(RLSMatrix?M?RLSMatrix?N?RLSMatrix?*Q);?????//求稀疏矩陣的和Q?=?M?+?N
Status?MultSMatrix(RLSMatrix?M?RLSMatrix?N?RLSMatrix?*Q);????//求稀疏矩陣乘積Q?=?M?×N?
main()
{
????RLSMatrix?A?B?C;//稀疏矩陣A、B和C均以三元組表作為存儲結構,C存放A、B相加相乘的結果?
????//創建稀疏矩陣A、B
????printf(“請輸入稀疏矩陣A\n“);?
????CreateSMatrix(&A);
????printf(“稀疏矩陣A為:\n“);
????PrintSMatrix(A);
????printf(“\n\n“);
????printf(“請輸入稀疏矩陣B\n“);
????CreateSMatrix(&B);
????printf(“稀疏矩陣B為:\n“);
????PrintSMatrix(B);
????printf(“\n\n“);
????//求稀疏矩陣的和C?=?A?+?B,并輸出相加結果矩陣C?
????if(AddSMatrix(A?B?&C))
????{
?????????printf(“求疏矩陣的和C?=?A?+?B,并輸出相加結果矩陣C:\n“);
?????????PrintSMatrix(C);
?????????printf(“\n“);
????}
????else?printf(“兩個矩陣行列數不完全相等,不是同類矩陣,不能相加。\n“?);
????
????//求稀疏矩陣乘積C?=?A?×B,并輸出相乘結果矩陣C
????if(MultSMatrix(A?B?&C))
????{
?????????printf(“稀疏矩陣乘積C?=?A?×B,并輸出相乘結果矩陣C:\n“);
?????????PrintSMatrix(C);
?????????printf(“\n“);
????}
????else?printf(“稀疏矩陣A的列數和B的行數不相等,不能相乘。\n“);
????printf(“\n“);
????//程序結束
????system(“pause“);
????return?0;?
}
//創建稀疏矩陣M,采用三元組表存儲表示
Status?CreateSMatrix(RLSMatrix?*M)
{
???????int?m?n?t?e;????????????????//行數m,列數n,非零元個數t和非零元值e?
???????int?i?j?k?a?b;???????????????????//中間變量
???????int?num[MAXSIZE];??????????????//每行非零元素個數
???????int?flag?[MAXSIZE][MAXSIZE];???//標記數組:此位置是否已經有非零元素?
???????
???????for(i?=?0;?i?????????????for(j?=?0;?j??????????????????flag?[i][j]?=?0;
??????????????????
???????//輸入M的行數、列數和非零元個數
???????do?{
??????????printf(“請分別輸入矩陣的行數、列數和非零元個數:\n“);?
??????????printf(“行數:“);
??????????scanf(“%d“?&m);
??????????printf(“列數:“);
??????????scanf(“%d“?&n);
??????????printf(“非零元的個數:“);
??????????scanf(“%d“?&t);
??????????if(m?0?||?n?0?||?t?0?||?t?>?m?*?n)?printf(“輸入的數據不符合要求!!!“);
???????}?while(m?0?||?n?0?||?t?0?||?t?>?m?*?n);
???????M->mu?=?m?M->nu?=?n?M->tu?=?t;//保存?
???????//按行序輸入非零元
???????if(t?==?0)?return?OK;
???????for(k?=?1;?k?<=?t;?k++)
???????{
???????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????9785??2008-11-03?23:03??稀疏矩陣相加相乘\稀疏矩陣相加相乘(三元組).c
?????文件??????15530??2008-10-30?22:21??稀疏矩陣相加相乘\稀疏矩陣相加相乘(十字鏈表).cpp
?????目錄??????????0??2009-09-30?14:16??稀疏矩陣相加相乘
-----------?---------??----------?-----??----
????????????????25315????????????????????3
- 上一篇:SD卡初始化流程圖超詳細
- 下一篇:《操作系統概念》第七版1-13章答案含代碼
評論
共有 條評論