数据结构实验报告之三元组顺序存储的稀疏矩阵练习(代码版)

#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