源代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
#define MAXRC 10
//三元组结构体
typedef struct{
//所在行数,列数
int i,j;
//值
int e;
}triple;
//存储矩阵的三元组顺序表
typedef struct{
//存储数据
triple data[MAXSIZE + 1];
//存储矩阵的行数,列数和非 0 元的个数
int mu,nu,tu;
}TSMatrix;
//初始化三元组顺序表
TSMatrix tcreate(int m,int n,int t){
TSMatrix M;
int k;
M.mu = m;
M.nu = n;
M.tu = t;
printf("input %d data ",M.tu);
printf("i j e ");
for(k=1;k<=M.tu;k++){
scanf("%d%d%d",&M.data[k].i,&M.data[k].j,&M.data[k].e);
}
return M;
}
//输出矩阵 M 的函数,以二维的格式呈现
void printt(TSMatrix M){
int i,j,k=1;
//输出矩阵的每一行
for(i=0;i<M.mu;i++){
printf("\n");
//输出矩阵的每一列
for(j=0;j<M.nu;j++){
//判断矩阵中是否有非 0 元存在
if(k>M.tu){
printf("%3d",0);
}
else{
//如果对应位置为非 0 元,则输出
if((i==M.data[k].i) && (j == M.data[k].j)){
printf("%3d",M.data[k].e);
k++;
}else{
//否输出 0
printf("%3d",0);
}
}
}
}
printf("\n");
}
//稀疏矩阵的快速转置
TSMatrix quik(TSMatrix a){
TSMatrix b;
int k,q,col;
int num[20]; //序号(col)从1到b.tu
int copt[20]; //序号(col)从1到b.tu
b.mu=a.nu;
b.nu=a.mu;
b.tu=a.tu;
if(b.tu)
{
for(col=0;col<a.nu;col++)num[col]=0;
for(k=1;k<=a.tu;k++) //a中第col列非0元素的个数
{
col=a.data[k].j;
++num[col];
}
copt[1]=1;
for(col=2;col<=a.nu;col++)
{copt[col]=copt[col-1]+num[col-1];} //每列首元位置
for(k=1;k<=a.tu;k++) //建立新的三元组矩阵
{
col=a.data[k].j;
q=copt[col];
b.data[q].i=a.data[k].j;
b.data[q].j=a.data[k].i;
b.data[q].e=a.data[k].e;
copt[col]++;
}
for(col=1;col<=a.tu;col++) printf("%d ",num[col]);
}
return b;
}
///////
int main(){
int m,n,t;
TSMatrix E,F;
printf("input m,n,t:\n");
scanf("%d%d%d",&m,&n,&t);
E = tcreate(m,n,t);
printt(E);
F=quik(E);
printt(F);
system("pause");
}
为什么结果不输出转置矩阵和num[]?
for(col=1;col<=a.nu;col++)num[col]=0;//??????????????????
for(k=1;k<=a.tu;k++) //a中第col列非0元素的个数
{
col=a.data[k].j;
++num[col+1];//????????????????????
}
copt[1]=1;
for(col=2;col<=a.nu;col++)
{copt[col]=copt[col-1]+num[col-1];} //每列首元位置
for(k=1;k<=a.tu;k++) //建立新的三元组矩阵
{
col=a.data[k].j+1;//???????????????????????
q=copt[col];
b.data[q].i=a.data[k].j;
b.data[q].j=a.data[k].i;
b.data[q].e=a.data[k].e;
copt[col]++;
}
for(col=1;col<=a.nu;col++) printf("%d ",num[col]);//????????????
快速转置函数里的错误。主要是因为你的下标导致。你的i和j下标是从0开始,num和copt下标就有点乱,配合i和j就更乱了。所以干脆把num和copt下标都从1开始,也就是我打问号的那一行进行了改动。输出num那一行是你的for里面写错了。你可以试一试,我是分析出来的,没有跑程序。
以后把下标统一全从1开始,会少很多误会和错误。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y
C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html