#include <stdio.h> #include <stdlib.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,t->j=j; 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+1]={}; int num[size+1]={}; int p[size+1]={}; int temp,k; int col=1; int count[n]={}; for(k=0;k<size;k++){ count[t[k].j]++; } for(k=1;k<=n;k++){ num[k]=count[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]-1; if(T[temp].value!=0){ 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; }else{ T[temp].i=t[k].j; T[temp].j=t[k].i; T[temp].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\n",sum); printf("原三元组\n"); for(int k=0;k<size;k++){ printf("(%d,",t[k].i); printf("%d,",t[k].j); printf("%d)",t[k].value); } printf("\n"); T=t; printf("经转置的三元组\n"); swapMatrix(t,size); return 0; }
数据结构实验报告之三元组顺序存储的稀疏矩阵练习(代码版)
猜你喜欢
转载自www.cnblogs.com/angoli/p/12746468.html
今日推荐
周排行