松鼠的窝 2017-12-04
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 225 #define N 9 typedef struct{ int i,j; int e; }Triple; typedef struct{ Triple data[MAXSIZE+1]; int mu,nu,tu; }TSMatrix; int CreatSMatrix(TSMatrix &M){ M.mu= N; M.nu = N; M.tu = 0; return 1; } void TransposeSMatrix(TSMatrix M,TSMatrix &T){ T.mu = M.mu; T.nu = M.nu; T.tu = M.tu; int c=1; for(int i = 1;i<N;i++){ for(int j = 1;j<N;j++){ if(M.data[c].e!=0){ T.data[c].e = M.data[c].e; T.data[c].i = M.data[c].j; T.data[c].j = M.data[c].i; c++; } } } } int InsertElem(TSMatrix *M,int row,int col,int e){ int i,t,p; if(M->tu>=MAXSIZE){ printf("\nError:Insert position is beyond the arrange.\n"); return 0; } p=1; if(M->tu==0){ M->data[p].i = row; M->data[p].j = col; M->data[p].e = e; M->tu++; return 1; } for(t=1;t<=M->tu;t++)//寻找合适的插入位置 if((row>=M->data[t].i)&&(col>=M->data[t].j)) p++; if(row==M->data[t-1].i && col==M->data[t-1].j){//插入前,该元素已经存在 M->data[t-1].e=e; return 1; } for(i=M->tu;i>=p;i--){//移动p之后的元素 M->data[i+1].i=M->data[i].i; M->data[i+1].j=M->data[i].j; M->data[i+1].e=M->data[i].e; } //插入新元素 M->data[p].i=row; M->data[p].j=col; M->data[p].e=e; M->tu++; return 1; } void AddSMatrix(TSMatrix M,TSMatrix T,TSMatrix &W){ int c=1; for(int i = 1;i<=W.mu;i++){ for(int j = 1;j<=W.nu;j++){ if(i==M.data[c].i&&j==M.data[c].j&&i==T.data[c].i&&j==T.data[c].j){ W.data[c].e= M.data[c].e +T.data[c].e; W.data[c].i = i; W.data[c].j = j; W.tu++; c++;} else if(i==M.data[c].i&&j==M.data[c].j){ W.data[c].e= M.data[c].e; W.data[c].i = i; W.data[c].j = j; W.tu++; c++; }else if(i==T.data[c].i&&j==T.data[c].j){ W.data[c].e=T.data[c].e; W.data[c].i = i; W.data[c].j = j; W.tu++; c++; } } } } void PrintfSMatrix(TSMatrix *M){ int i,j,p=1; if(M->tu==0){ printf("0矩阵"); exit(0); } for(i=1;i<=M->mu;i++){ for(j=1;j<=M->nu;j++){ if(i==M->data[p].i&&j==M->data[p].j){ printf("%d\t",M->data[p].e); p++; }else{ printf("0\t"); } } printf("\n"); } printf("\n"); } int main(){ TSMatrix M,T,W; CreatSMatrix(M); CreatSMatrix(T); CreatSMatrix(W); int r,c,e,n,x,p=1; printf("请输入非零元素的个数;"); scanf("%d",&n); for(int i=0;i<n;i++){ printf("\请输入非零元素的行数列数及非零元素"); scanf("%d %d %d",&r,&c,&e); InsertElem(&M,r,c,e); } for(int i=1;i<=M.mu;i++){ for(int j=1;j<=M.nu;j++){ if(i==M.data[p].i&&j==M.data[p].j){ printf("%d\t",M.data[p].e); p++; }else{ printf("0\t"); } } printf("\n"); } while(1){ printf("1.转置 2.相加\n输入相应编号执行操作:"); scanf("%d",&x); switch(x){ case 1: TransposeSMatrix(M,T); PrintfSMatrix(&T); break; case 2: AddSMatrix(M,T,W); PrintfSMatrix(&W); exit(0); } } return 0; }