資源簡(jiǎn)介
分別用三元組和十字鏈表兩種方法實(shí)現(xiàn)了稀疏矩陣的相加和相乘

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