没耳朵的Rabbit 2022-04-17 16:33
浏览 204
已结题

我找到了同学的代码bug!——西工大NOJ数据结构实验——2.1稀疏矩阵转置

西工大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啦!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月25日
    • 创建了问题 4月17日

    悬赏问题

    • ¥15 #MATLAB仿真#车辆换道路径规划
    • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
    • ¥15 数据可视化Python
    • ¥15 要给毕业设计添加扫码登录的功能!!有偿
    • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
    • ¥15 微信公众号自制会员卡没有收款渠道啊
    • ¥15 stable diffusion
    • ¥100 Jenkins自动化部署—悬赏100元
    • ¥15 关于#python#的问题:求帮写python代码
    • ¥20 MATLAB画图图形出现上下震荡的线条