資料結構關於稀疏矩陣相加問題
阿新 • • 發佈:2019-01-08
近些日子也是在寫資料結構的一些東西,老師出了一道題,原題是,用三元組方法儲存兩個稀疏矩陣,並將這兩個矩陣相加。
今天下午也就那出來想了想,寫了寫
#include<stdio.h> #define MAX 100 struct Triple{ int i,j; int e; }; struct TSMatrix{ Triple date[MAX+1];//非零三元組表,date[0]不用 int mu,nu,tu;//矩陣的行數,列數和非零圓個數 }; /*建立稀疏矩陣*/ int CreatSMatrix(TSMatrix &M) { int i; Triple T; int flag=0; printf("please input the TSMatrix's line low and amount\n"); scanf("%d %d %d",&M.mu,&M.nu,&M.tu); if(M.tu>MAX)//如果非零圓太多,退出 return 0; M.date[0].i=0; for(i=0;i<M.tu;i++) { do { printf("請按行輸入第%d個非零元素在的行,列,元素值\n"); scanf("%d %d %d ",&T.i,&T.j,&T.e); if(T.i<1||T.i>M.mu||T.j<1||T.j>M.nu) flag=1; }while(flag);//輸入值範圍不對重新輸入 M.date[i]=T; } return 0; } /*比較函式*/ int comp(int a,int b) { if(a<b) return -1; if(a==b) return 1; } /*稀疏矩陣加法運算函式*/ int AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)//M+N=Q { int m=1,n=1,q=0;//m,n,q 是矩陣元素個數 if(M.mu!=N.mu||M.nu!=N.nu)//如果行列不相等 return 0; Q.mu=M.mu; Q.nu=M.nu; //設定Q的行數和列數 while(m<=M.tu&&n<=N.tu)//當兩個矩陣的元素都沒有處理完的時候 { switch (comp(M.date[m].i,N.date[n].i))//比較兩行當前元素的行值關係 { case -1:Q.date[++q]=M.date[m++];//矩陣M的行值小,將M的值賦給Q break; case 0:switch(comp(M.date[m].j,N.date[n].j))//,行值相等。繼續比較當前元素的列值關係 { case -1:Q.date[++q]=M.date[m++]; //矩陣M的列值較小,將M賦給Q break; case 0:Q.date[++q]=M.date[m++];//MN矩陣當前非零元的行列軍相等,將其想加賦給Q Q.date[q].e+=N.date[n++].e;//想加M+N if(Q.date[q].e==0)//兩元素之和為0,不存入稀疏矩陣 { q--; } case 1:Q.date[++q]=N.date[n++];//矩陣N的列值小,將N的值賦給矩陣Q } break; case 1:Q.date[++q]=N.date[n++];//矩陣N的行值小,將N的行值賦給矩陣Q }//以下迴圈最多執行一個,,, while(m<=N.tu)//矩陣N的元素已經全部處理完畢,開始處理N的元素 Q.date[++q]=M.date[m++]; while(n<=N.tu)//矩陣M的元素已經全部處理完畢,開始處理M的元素 Q.date[++q]=N.date[n++]; if(q>MAX)//非零元太多 return -1; else Q.tu=q; //矩陣Q的非零元個數 return 0; } } /*輸出函式*/ void ShowSMatrix(TSMatrix M) { int i,j,k=1;//非零元的計數器k Triple *p=M.date+1;// 建立一個指向M第一個元素的指標 for(i=1;i<M.mu;i++) for(j=1;j<M.nu;j++)//迴圈 { if(k<M.tu&&p->i==i&&p->j==j)//如果p指向的非零元為當前迴圈所在處理的非零元 { printf("%5d",(p++)->e);//輸出 k++;//計數器+1 } else printf("%5d",0);//p指向的元素不是當前迴圈在處理的元素,輸出0 printf("\n"); } } int main() { TSMatrix A,B,C; printf("建立A矩陣\n"); CreatSMatrix(A); printf("建立B矩陣\n"); CreatSMatrix(B); AddSMatrix(A,B,C); ShowSMatrix(C); return 0; }
有不對的地方還請大家指教