数据结构(三)三元组的装置

问题:输入一个三元组表,先输出其矩阵形态,然后对其进行转置并输出转置后的矩阵。

程序代码

#include <stdio.h> 

  1. #define MAXSIZE 50 

typedef  struct                 //定义三元组 

 int m,n; 

 int e; 

}Triple; 

typedef struct 

 Triple data[MAXSIZE]; 

 int mu,nu,tu; 

}TSMatrix; 

void FastTranspose(TSMatrix M,TSMatrix*T);

void output(TSMatrix *M);

  int main() 

   TSMatrix A,T;int k; 

   ; 

   

    printf("Please input the matrix rows and columns:");         //输入要输出的矩阵行和列

     scanf("%d%d",&A.mu,&A.nu); 

    printf("The number of non-zeroelements:");scanf("%d",&A.tu); //输入非零元素个数

    printf("input thetriple:\n");                              //顺序输入三元组 

    for(k=1;k<=A.tu;k++) 

    { 

      scanf("%d %d%d",&A.data[k].m,&A.data[k].n,&A.data[k].e); 

    } 

    printf("The original matrixis:\n"); 

    output(&A);                                                //输出原矩阵

    FastTranspose(A,&T);                                        //转置运算

    printf("The transpose of the matrix is:\n"); 

    output(&T);                                                //输出转置后的矩阵

    return 0; 

}  

void FastTranspose(TSMatrixM,TSMatrix *T)                     //对三元组进行转置 

    int col,p,q,t;      

    int num[MAXSIZE],cpot[MAXSIZE]; 

 

 

   T->mu=M.nu;T->nu=M.mu;T->tu=M.tu; 

    if(T->tu) 

   { 

     for(col=1;col<=M.nu;++col)  

       num[col]=0; 

     for(t=1;t<=M.tu;++t)  

       ++num[M.data[t].n];      

 cpot[1]=1; 

 for(col=2;col<=M.nu;++col)         

 cpot[col]=cpot[col-1]+num[col-1]; 

 for(p=1;p<=M.tu;++p)        

    {  

     col=M.data[p].n; 

     q=cpot[col]; 

    T->data[q].m=M.data[p].n;  

    T->data[q].n=M.data[p].m; 

    T->data[q].e=M.data[p].e; 

    ++cpot[col];        

    } 

  } 

void output(TSMatrix *M)                                //输出三元组 

  int i,j; 

  int t=1; 

  for(i=1;i<=M->mu;i++) 

  { 

    for(j=1;j<=M->nu;j++) 

    { 

       if(M->data[t].m==i&&M->data[t].n==j) 

        { 

            printf("%d   ",M->data[t].e); 

            t++; 

        } 

        else printf("0   "); 

    } 

    printf("\n"); 

  }   

}  

运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值