西工大NOJ数据结构实验——2.1稀疏矩阵转置
大家都做过这个实验,都知道它很容易就会WA,我当初也是费了好大的劲,才把这个实验给AC了。
但是,我的同学也有一些问题,自己也实在是找不出来bug,所以我就帮他找了找,最后也成功帮同学AC了,下面大家一起来看一看叭!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1000 //设非零元素的个数最多为1000
typedef int ElementType;
typedef struct
{
int row,col;
ElementType e; //该非零元素的值
}Triple;
typedef struct
{
Triple data[MAXSIZE+1]; //不用data[0]所以加1
int m,n,len; //m行n列len为非零元素的个数
}TSMatrix;
void TransposeTSMatrix(TSMatrix A,TSMatrix *B)//把矩阵A转置到B矩阵所指向的矩阵中去
{
int i,j,k;
B->m=A.n;B->n=A.m;B->len=A.len;//B的行指向A的列,B的列指向A的行,两个三元组的len相同
if(B->len>0)
{
j=1;//j为辅助计数器,记录转置后的三元组在三元组表B中的下标值
for(k=1;k<=A.n;k++)//扫描三元组表A共A.n次,每次寻找列值为k的三元组进行转置
for(i=1;i<=A.len;i++)//从头至尾扫描表A,寻找col值为k的三元组进行转置
if(A.data[i].col==k)
{
B->data[j].row=A.data[i].col;
B->data[i].col=A.data[i].row;
B->data[j].e=A.data[i].e;
j++;
}//内循环中if 结束
}//if(B->len>0)结束
}//end of TransposeTSMatrix
int main()
{
TSMatrix A,B;
scanf("%d %d",&A.m,&A.n);
while(1)
{
A.len=0;
int i=1;
scanf("%d %d %d",&A.data[i].row,&A.data[i].col,&A.data[i].e);
if(A.data[i].row==0&&A.data[i].col==0&&A.data[i].e==0) break;
i++;
A.len++;
}
TransposeTSMatrix(A,&B);
for(int i=1;i<=B.len;i++)
printf("%d %d %d\n",B.data[i].row,B.data[i].col,B.data[i].e);
return 0;
}
运行结果是这样的:
4 4
1 1 1
2 1 2
3 2 3
0 0 0
Process exited after 7.391 seconds with return value 0
请按任意键继续. . .
最后我找到了问题在哪里!
1.在main函数中:
while(1)
{
** A.len=0;
int i=1;**
scanf("%d %d %d",&A.data[i].row,&A.data[i].col,&A.data[i].e);
if(A.data[i].row==0&&A.data[i].col==0&&A.data[i].e==0) break;
i++;
A.len++;
}
A.len=0;
int i=1;
这两句应该放在循环外面;
2.在TransposeTSMatrix函数中
if(B->len>0)
{
j=1;//j为辅助计数器,记录转置后的三元组在三元组表B中的下标值
** for(k=1;k<=A.n;k++)**//扫描三元组表A共A.n次,每次寻找列值为k的三元组进行转置
for(i=1;i<=A.len;i++)//从头至尾扫描表A,寻找col值为k的三元组进行转置
if(A.data[i].col==k)
{
B->data[j].row=A.data[i].col;
B->data[i].col=A.data[i].row;
B->data[j].e=A.data[i].e;
j++;
}//内循环中if 结束
}//if(B->len>0)结束
for(k=1;k<=A.n;k++)
这个循环体应该写成:
for(k=0;k<A.n;k++)
最后只改了这2个地方,同学的代码就AC啦!