#include <stdio.h> #define MAXSIZE 30 #define n 5 typedef int ElemType; // 定义三元组 typedef struct{ int i, j; ElemType value; }Triple; // 矩阵压缩 int zipMatrix(int arr[n][n], Triple *t){ int index=0; int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++){ if(arr[i][j]!=0){ t->i=i+1,t->j=j+1; t->value=arr[i][j]; t++; index++; } } return index; } // 对角线求和 int sumMatrix(Triple t[], int size){ int s=0; for(int k=0;k<size;k++){ if(t[k].i==t[k].j||(t[k].i+t[k].j)==n-1){ s=s+(t[k].value); } } return s; } // 快速转置 void swapMatrix(Triple t[], int size){ Triple T[size]={}; int num[n+1]={}; int p[n+1]={}; int temp,k;
int col[n]={}; for(k=0;k<size;k++){ col[t[k].j]++; } for(k=1;k<=n;k++){ num[k]=col[k-1]; } p[1]=1; for(k=2;k<=n;k++){ p[k]=p[k-1]+num[k-1]; } for(k=0;k<size;k++){ temp=p[t[k].j]-1;
while(T[temp++].value!=0); T[temp-1].i=t[k].j; T[temp-1].j=t[k].i; T[temp-1].value=t[k].value; } for(k=0;k<size;k++){ printf("(%d,",T[k].i); printf("%d,",T[k].j); printf("%d)",T[k].value); } } int main(){ // 定义一个数组 int arr[n][n]={{0,0,6,4,0}, {7,3,8,0,0},{0,4,0,2,0}, {6,3,0,0,0},{4,0,9,0,1} }; // 初始化一个三元组 Triple t[MAXSIZE]={}; Triple *T=t; int size=zipMatrix(arr,T); int sum=sumMatrix(t,size); printf("对角线之和为:%d ",sum); printf("原三元组 "); for(int k=0;k<size;k++){ printf("(%d,",t[k].i); printf("%d,",t[k].j); printf("%d)",t[k].value); } printf(" "); printf("经转置的三元组 "); swapMatrix(t,size); return 0; }