稀疏矩阵A、B均采用三元组顺序表表示,验证实现矩阵A快速转置算法,并设计、验证矩阵A、B相加得到矩阵C的算法。

题目:稀疏矩阵A、B均采用三元组顺序表表示,验证实现矩阵A快速转置算法,并设计、验证矩阵A、B相加得到矩阵C的算法。

(1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。

(2) 设计算法将随机生成的稀疏矩阵转换成三元组顺序表形式存储。

(3) 设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。

(4) 输出随机生成的稀疏矩阵A、B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。

1、在本次实验中,首先,从键盘输入A,B矩阵的行数与列数并建立稀疏矩阵A和B的信息,然后使两个矩阵相加,再输出A,B矩阵三元组表,转置三元组表。

2. 演示程序以用户和计算机对话的方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上先后输入两个矩阵信息。

3. 程序执行的命令包括:

(1) 输入矩阵A的行数和列数;

(2) 输出A的三元组顺序表;

(3) 将A矩阵转置,并输出转置后的三元组表和矩阵;

(4) 输入矩阵B的行数和列数;

(5) 输出B的三元组顺序表;

(6) 将B矩阵转置,并输出转置后的三元组表和矩阵。

(7) 将矩阵A与B相加得到矩阵C

(8) 结束

#include<stdio.h> 
#define MAXSIZE 1250
typedef int ElemType;
typedef struct{
    int i,j;
    ElemType e;    
}Triple;

typedef struct{
    Triple data[MAXSIZE+1];
    int mu,nu,tu;
}TSMatrix;

int a[10][10];

void toTSM(TSMatrix *M){  //三元组顺序表的创建 
    int p=1;
    for(int i=1;i<=M->mu;i++){
        for(int j=1;j<=M->nu;j++){
            if(a[i][j]!=0){
                M->data[p].i=i;
                M->data[p].j=j;
                M->data[p].e=a[i][j];
                p++;
            }
        }
    }
} 

void print(TSMatrix M){   //输出稀疏矩阵 
    for(int i=1;i<M.mu;i++){
        for(int j=1;j<=M.nu;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
}

void printT(TSMatrix Q){  //打印三元组表 
    for(int i=1;i<=Q.tu;i++){
        printf("%d %d %d\n",Q.data[i].i,Q.data[i].j,Q.data[i].e);
    }
}


void toTSMt(TSMatrix M,TSMatrix &T){    //三元组的转置
    int num[MAXSIZE+1];      //用于记录T的每行的非零元个数 
    int cpot[MAXSIZE+1];    //记录T的每行第一个非零元所在三元组中的位置 
    int col,p,q,j,t;
    T.nu=M.mu;  T.mu=M.nu;  T.tu=M.tu;
    for(col=1;col<=T.mu;col++)  num[col]=0;  //初始化 
    for(t=1;t<=M.tu;t++)   ++num[M.data[t].j];  //记录T的每行(M的每列)的个数 
    cpot[1]=1;
    for(col =2;col<=T.mu;col++)  cpot[col]=cpot[col-1]+num[col-1];
    for(p=1;p<=T.tu;p++){
        col=M.data[p].j;  q=cpot[col];
        T.data[q].e=M.data[p].e;
        T.data[q].i=M.data[p].j;
        T.data[q].j=M.data[p].i;
        ++cpot[col];
    }    
}

void addTSMatrix(TSMatrix S1,TSMatrix S2,TSMatrix &S){      //三元组的加法 
    S.mu=S1.mu;
    S.nu=S1.nu;
    int k1=1,k2=1,count=0;
    while(k1<=S1.tu && k2<=S2.tu){
        if(S1.data[k1].i>S2.data[k2].i){
            count++;
            S.data[count].i=S2.data[k2].i;
            S.data[count].j=S2.data[k2].j;
            S.data[count].e=S2.data[k2].e;
            k2++;
        }else if(S1.data[k1].i<S2.data[k2].i){
            count++;
            S.data[count].i=S1.data[k1].i;
            S.data[count].j=S1.data[k1].j;
            S.data[count].e=S1.data[k1].e;
            k1++;
        }else{
            if(S1.data[k1].j>S2.data[k2].j){
                count++;
                S.data[count].i=S2.data[k2].i;
                S.data[count].j=S2.data[k2].j;
                S.data[count].e=S2.data[k2].e;
                k2++;
            }else if(S1.data[k1].j<S2.data[k2].j){
                count++;
                S.data[count].i=S1.data[k1].i;
                S.data[count].j=S1.data[k1].j;
                S.data[count].e=S1.data[k1].e;
                k1++;
            }else{
                if(S1.data[k1].e+S2.data[k2].e!=0){
                    count++;
                    S.data[count].i=S1.data[k1].i;
                    S.data[count].j=S1.data[k1].j;
                    S.data[count].e=S1.data[k1].e+S2.data[k2].e;
                    k1++;
                    k2++;
                }else{
                    k1++;
                    k2++;
                }
            }
        }
    }
    while(k1<=S1.tu){
        count++;
        S.data[count].i=S1.data[k1].i;
        S.data[count].j=S1.data[k1].j;
        S.data[count].e=S1.data[k1].e;
        k1++;
    }
    while(k2<=S2.tu){
        count++;
        S.data[count].i=S2.data[k2].i;
        S.data[count].j=S2.data[k2].j;
        S.data[count].e=S2.data[k2].e;
        k2++;
    }
    S.tu=count;
}

int main(){
    TSMatrix M;
    TSMatrix T;
    TSMatrix S;
    printf("请输入稀疏矩阵的行列数与非零元个数分别为 :  ");
    scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
    //初始化稀疏矩阵
    int x,y,value;
    printf("请输入每个非零元的位置与值:\n"); 
    for(int i=0;i<M.tu;i++){
        scanf("%d %d %d",&x,&y,&value);
        a[x][y]=value;    
    } 
    toTSM(&M);
    printf("输出三元组如下:\n");
    printT(M);
    printf("\n"); 
    printf("转置后的三元组为:\n");
    toTSMt(M,T);
    printT(T);
    printf("\n");
    //懒得创建新的一个三元组,这里直接用转置前后的两个三元组进行三元组的加法计算 
    printf("三元组相加结果为:\n");
    addTSMatrix(M,T,S);
    printT(S);
    printf("\n");
}

运行结果

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值