数据结构与算法 ~ 数组和广义表 ~ 稀疏矩阵的快速转置

  数据结构与算法中数组和广义表的稀疏矩阵的快速转置

#include<stdlib.h>
#include<stdio.h>
#define   MAXSIZE   100
typedef struct{
	        int  row ,col ;
	        int  data ;
	       } Triple;

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

void initarray(TSMatrix *A)
{
 int   i,j,e,p=0;
  A->mu=0;
  A->nu=0;
  while(1)
  {
    printf("\n请输入矩阵节点的信息==>(行 列  值)(exit for -1):");
    scanf("%d%d%d",&i,&j,&e);
    if (i==-1)  break;
    if (p>MAXSIZE){
         printf("\n空间满了.");
         break;
       }/*if*/
   else {
              A->data[++p].row=i;
              A->data[p].col=j;
              A->data[p].data=e;
             A->mu =(A->mu > i)? A->mu :i ;
             A->nu =( A->nu > j) ? A->nu :j  ;
            }/*else*/
   }/*while*/
   A->tu=p;
}/*initarray*/

void Print(TSMatrix *A)
{
  int i;
  printf("\n当前矩阵是==%d x %d,  数据是 %d",A->mu , A->nu , A->tu);
  for(i=1;i<=A->tu ;++i)
    printf("\n[%d , %d , %d ]",A->data[i].row,A->data[i].col,A->data[i].data);
  printf("\n矩阵输出结束.");
}/*Print*/

void TransMatrix(TSMatrix *A ,TSMatrix *B)
{
   int  q , j , p ;
   int   num[MAXSIZE+1],cpot[MAXSIZE+1];
   B->mu=A->nu ; B->nu=A->mu ; B->tu= A->tu;/*三元组的规模参数*/
   if ( B->tu)
     {
        for(j=1; j<=A->nu ; ++j) num[j]=0;
        for(p=1;p<=A->tu ; ++p)  ++num[A->data[p].col];   /*求原数组中每一列含非零元素个数*/
        cpot[1]=1;
        for(j=2 ; j<=A->nu ; ++j) cpot[j]=cpot[j-1]+num[j-1];
        for(p=1;p<=A->tu;++p)
            {
               j=A->data[p].col;                              /*取列号*/
              q=cpot[j];                                           /*对应B表中各行的当前始址*/
               B->data[q].row=A->data[p].col;
               B->data[q].col=A->data[p].row;
               B->data[q].data=A->data[p].data;
               ++cpot[j];                                          /*B表中对应行当前的始位置下移*/
           }/*for*/
       }/*if*/
}/*TransMatrix*/

int main()
{
  initarray(&M);
  Print(&M);
  TransMatrix(&M,&T);
  Print(&T);
  system("pause");
  exit(0);
}

 

运行结果:


请输入矩阵节点的信息==>(行 列  值)(exit for -1):1 2 12

请输入矩阵节点的信息==>(行 列  值)(exit for -1):1 3 9

请输入矩阵节点的信息==>(行 列  值)(exit for -1):3 1 -3

请输入矩阵节点的信息==>(行 列  值)(exit for -1):3 6 14

请输入矩阵节点的信息==>(行 列  值)(exit for -1):4 3 24

请输入矩阵节点的信息==>(行 列  值)(exit for -1):5 2 18

请输入矩阵节点的信息==>(行 列  值)(exit for -1):6 1 15

请输入矩阵节点的信息==>(行 列  值)(exit for -1):6 4 -7

请输入矩阵节点的信息==>(行 列  值)(exit for -1):-1 -1 -1

当前矩阵是==6 x 6,  数据是 8
[1 , 2 , 12 ]
[1 , 3 , 9 ]
[3 , 1 , -3 ]
[3 , 6 , 14 ]
[4 , 3 , 24 ]
[5 , 2 , 18 ]
[6 , 1 , 15 ]
[6 , 4 , -7 ]
矩阵输出结束.
当前矩阵是==6 x 6,  数据是 8
[1 , 3 , -3 ]
[1 , 6 , 15 ]
[2 , 1 , 12 ]
[2 , 5 , 18 ]
[3 , 1 , 9 ]
[3 , 4 , 24 ]
[4 , 6 , -7 ]
[6 , 3 , 14 ]
矩阵输出结束.请按任意键继续. . .

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值