回 帖 发 新 帖 刷新版面

主题:关于数组快速转置的一个疑问

[size=4][/size][size=3]#include <stdio.h>
#define N 10
typedef  struct{
 int i,j;
 int e;
}tsMatrix;
typedef struct{
 tsMatrix data[N];/*最大长度为N */
 int mu,nu,tu;
}TSMatrix;

int FastTransposeSMatrix(TSMatrix M,TSMatrix *T)
{
    int col,p,q,t;     
    int num[N],cpot[N];

    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) 
 [color=008000]++num[M.data[t].j];[/color] 
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].j;q=cpot[col];
    T->data[q].i=M.data[p].j;T->data[q].j=M.data[p].i;
    T->data[q].e=M.data[p].e;++cpot[col];
    }
  }
}
void printM(TSMatrix *M)
{
  int p,q;int t=1;
  for(p=1;p<=M->mu;p++)
  {
    for(q=1;q<=M->nu;q++)
 {if(M->data[t].i==p&&M->data[t].j==q)
    {printf("%d   ",M->data[t].e);t++;}
 else printf("0   ");}
 printf("\n");}  printf("\n\n");
}

void main()
{
TSMatrix  A,T;int k;
printf("请输入矩阵的大小:");
printf("它的行:");scanf("%d",&A.mu);
printf("它的列:");scanf("%d",&A.nu);
printf("请输入不超过10且不为0的长度:");scanf("%d",&A.tu);
for(k=1;k<=A.tu;k++)
   {printf("请输入第 %d 个数的情况:\n",k);
    printf("它所在的行位置:");scanf("%d",&A.data[k].i);
    printf("它所在的列位置:");scanf("%d",&A.data[k].j);
    printf("它的值:");scanf("%d",&A.data[k].e);
    }
printf("\n原矩阵:\n");
printM(&A);
FastTransposeSMatrix(A,&T);
printf("转置后的矩阵:\n");
printM(&T);
}[/size]我想问学过的人我用绿颜色表示那个代码,它的值是怎么得来的,我想不通。

回复列表 (共1个回复)

沙发

for(t=1;t<=M.tu;++t) 
 ++num[M.data[t].j];       是求M中每一列含非零元个数
还有楼主的程序有一点小小的问题,快速转置的那个函数缺少一个返回值,应为
int FastTransposeSMatrix(TSMatrix M,TSMatrix *T)
{
    int col,p,q,t;     
    int num[N],cpot[N];

    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].j]; 
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].j;q=cpot[col];
    T->data[q].i=M.data[p].j;T->data[q].j=M.data[p].i;
    T->data[q].e=M.data[p].e;++cpot[col];
    }
  }
    return 1;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册