若有一個矩陣(m*n),其中非0元素個數遠少於數值為0的元素個數,若開辟一個m*n大空間,來存儲這樣一個很多元素值為0的矩陣,浪費空間,於是我們只存儲這些非0的元素的下標及數值
用一個結構體——三元組,來表示這些非零元素的行r,列c,數值v的信息
typedef struct //三元組 { int r; //非零元所在的行 int c; //非零元所在的列 int v; //非零元的值 } node;
一個完整矩陣的包括這些信息需要存儲:矩陣的總行m,總列n,非零元的個數N,以及這些非零元的信息,所以再將這些信息用一個結構體來表示出來,其中非零元的相關信息用一個一維數組node a[100]來存儲
為什么用一維數組就可以來存儲矩陣(二維數組)的信息呢
這就是結構體node的方便之處 —— node將行、列、數值打包成一個整體
typedef struct { int m; //稀疏矩陣的行數 int n; //稀疏矩陣的列數 int N; //稀疏矩陣中非零元的個數 node a[100]; //存儲非零元的數組a }Matrix;
定義 Matrix M;
查找稀疏矩陣中是否存在值為p的元素
存在,則輸出所在的行M.a[i].r,列M.a[i].c,
不存在,輸出ERROR
首先用for循環實現,終止條件為i==M.N
如果匹配不成功,輸出ERROR。如何表示匹配不成功呢,這里用一個flag來標記,0表示不成功,flag初值為0,
如果匹配成功,后續就不用再繼續匹配,flag==1;輸出該元素所在的行M.a[i].r,列M.a[i].c 同時用break結束循環
在for循環外判斷flag的值 if(flag==0),則表示從i=0到i=M.N-1,都未匹配成功 那么cout<<"ERROR";
void search(Matrix M,int p) //查找p是否在稀疏矩陣中 { int i=0; int flag=0; for(i=0;i<M.N;i++) //匹配數組a中元素的value和p { if(p==M.a[i].v) //相等 { flag=1; cout<<M.a[i].r<<" "<<M.a[i].c<<endl; //輸出所在的行列 break; //跳出for循環 } } if(flag==0) //若未匹配成功,輸出ERROR cout<<"ERROR"<<endl; }