对稀疏矩阵进行转置操作,按照老师讲的,有两种办法。我用的是第一种最简单的,从上到下一行一行得走,虽然速度很慢,但是简单。

说实话这个题目很讨厌,我们定义的三元组里面mu表示的是行数,但是题目要求输入的m表示的是列数,这就很容易搞混了。

但是我们不用n和m表示行和列,而是用线性代数里面的r表示行,c表示列,这样做不容易错,反正它先输入的永远是行,后输入的永远是列。

其中进行转置操作的函数function,感觉很像咱们上学期用过的“冒泡排序”。

为什么答案都对但是仍然WA的原因:

首先,大概率就是输出输入的问题,也就是说,问题十有八九都出在了printf和scanf这两个函数上

下面我分情况讨论一下允许的输入格式:

1.输入两个正整数:

scanf("%d%d",&m,&n);        正确

scanf("%d %d",&m,&n);        正确

2.输入矩阵三元组:(我就栽在这个地方了mmp)

scanf("%d%d%d",&i,&j,&x);

if(i==0&&j==0&&x==0) break;        错误!

scanf("%d %d %d",&i,&j,&x);

if(i==0&&j==0&&x==0) break;        错误!

(具体为什么错误我也不清楚,反正这样做就是不对,不是RE就是WA)

(4.17日最新更新:上面的两个错误,好像又可以AC通过了,搞得我很懵圈)

(懵圈过后,我就开始怀疑,之前WA的原因,十有八九是因为我把“&&”写成了“&”)

scanf("%d",&i);

getchar();

scanf("%d",&j);

getchar();

scanf("%d",&x);

if(i==0&&j==0&&x==0) break;        正确!

3.输出转置后的矩阵三元组:

printf("%d %d %d\n"...)        正确!

printf("%d %d %d \n"...)        正确!

其次,小概率不是输入输出的问题,而是样例输出给的不够好,题目本身有问题!

为什么呢?因为如果你输入这样:

它的意思并不是下面这个矩阵:

它表示的其实是这个矩阵!!!

没想到叭!我就是第二次栽到了这里。

那这又是什么意思呢?意思就是:

在测试用例中,存在一种情况,比如说:

4 4

1 0 1

2 1 2

3 2 3

0 0 0

其中,1 0 1这种奇葩数据,它居然能拿得出来!!!

也就是说,在我们编写“矩阵转置”函数时,如果把第1层函数头写成下面这样子,是不对的:

for(int fre=1;fre<=p1->nu;fre++){

正确的应该是下面这样子:

for(int fre=0;fre<p1->nu;fre++){

下面是我AC的代码,希望能帮到大家:

最后如果对大家有所帮助,希望大家可以加关注哦。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct Triple{int i,j;int x;
}Triple;typedef struct TSMatrix{Triple data[1000];int mu,nu,tu;
}TSMatrix; TSMatrix* CreateEmptyTsmatrix(){TSMatrix *p=(TSMatrix*)malloc(sizeof(TSMatrix));if(p==NULL){printf("Out of space!\n");}else{p->mu=0;p->nu=0;p->tu=0;return p;}
}void Insert(TSMatrix *p,int i,int j,int x,int k){p->data[k].i=i;p->data[k].j=j;p->data[k].x=x;p->tu=p->tu+1;
}void BuildTsmatrix(TSMatrix* p){int k=0;while(1){int i,j,x;scanf("%d",&i);getchar();scanf("%d",&j);getchar();scanf("%d",&x);if(0==i&&0==j&&0==x) break;//如果输入0?0?0,那么最终i=0,j=1,x=0,这样矩阵中的元素就输入完毕了 else{Insert(p,i,j,x,k);k++;}}
}void Output(TSMatrix* p){for(int k=0;k<p->tu;k++){printf("%d %d %d \n",p->data[k].i,p->data[k].j,p->data[k].x);}
}void Transposition(TSMatrix* p1,TSMatrix* p2){//矩阵的转置int k2=0;for(int fre=0;fre<p1->nu;fre++){//1次fre能够完成p1中1列的转置//比如说,fre=0,把p1中第1列转置完成,变成p2的第1行 //然后fre=1,把p1中第2列转置完成,变成p2的第2行 //......//最后fre=p1->nu-1,把p1的最后一列转置完成,变成p2的第p1->nu行 for(int k1=0;k1<p1->tu;k1++){//完成p1中1列的转置时,从data[0]元素开始,挨个往下看,if(p1->data[k1].j==fre){//如果先找到了一个元素,它的列数正好是fre-1,那就放到p2里面 Insert(p2,p1->data[k1].j,p1->data[k1].i,p1->data[k1].x,k2);k2++;//k2仅且仅需要初始化1次,所以k2的定义放在所有循环的外面 }}}
}int main(){TSMatrix* p1=CreateEmptyTsmatrix();//p1放原矩阵 TSMatrix* p2=CreateEmptyTsmatrix();//p2放转置矩阵 int r,c;scanf("%d%d",&r,&c);//p1的行数为r,列数为c p2->nu=p1->mu=r;p2->mu=p1->nu=c;BuildTsmatrix(p1);Transposition(p1,p2);Output(p2);return 0;
}

实在不行的话,点个赞也可以哦。

西工大NOJ数据结构实验——2.1稀疏矩阵转置相关推荐

  1. 西工大NOJ数据结构实验——实验 2.4稀疏矩阵的乘法

    然后呢,对于这道题,有2点要注意: 1.在Sample Input和Sample Output中,所有的"?"都是因为格式问题,让空格转成了"?",所以我们在程 ...

  2. 西工大NOJ数据结构实验——1.1合并有序数组

    #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct NODE{int n; ...

  3. 西工大NOJ数据结构实验——1.2高精度计算PI值

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> typ ...

  4. 西工大NOJ数据结构理论——013.以十字链表为存储结构实现矩阵相加(严5.27)

      我第一下拿到这个题目,第一反应就是先定义好数据结构,然后构建好十字链表基础操作的函数,也就是"创插遍历"这些操作.下面是我的定义和函数操作. typedef int ElemT ...

  5. 西工大NOJ数据结构理论——021.逆波兰表达式(严7.38)

    这道题我参考的是(80条消息) 『西工大-数据结构-NOJ』 021-逆波兰表达式(耿7.38) 『西北工业大学』__LanXiu的博客-CSDN博客 (准确来说是快期末考试了,所以各科老师都在疯 狂 ...

  6. 西工大NOJ数据结构理论——017.输出以二叉树表示的算术表达式(严6.51)

    (17条消息) 『西工大-数据结构-NOJ』 017-输出以二叉树表示的算术表达式(耿6.51) 『西北工业大学』__LanXiu的博客-CSDN博客 上面是我参考的一位学长的博客. 先序建立二叉树, ...

  7. 西工大NOJ数据结构理论——014.求广义表深度(严5.30)

    第一下拿到这道题,我的脑袋轰一下就大了.如果说用"括号匹配"来做的话,这其实很简单.但是如果要用广义表来做的话,难度哗哗哗的就涨上来了.为什么呢?首先,要把读入的字符串存到广义表里 ...

  8. 西工大NOJ数据结构理论——007.表达式括号与匹配(严3.19)

    害怕提交次数过多,然后不再跑代码,影响成绩,所以又重新创建了两个号来测这道题. 结果全都正确,但就是一直"WA",然后Debug了近5个小时才把"WA"改成&q ...

  9. 西工大NOJ数据结构理论——015.建立二叉树的二叉链表存储结构(严6.70)

    我相信,大家都已经了解了这道题的背景,以及明白了我们需要做的事情. 对于这道题的背景,相信大家都熟悉,所以就不说了. 关于我们需要做的事情,大家也已经有了自己的思路.所以,我只在下面简短的写一写我的思 ...

最新文章

  1. 一次愉快的 bug 修复经历
  2. SQL学习(二)之四大查询语句以及标准写法
  3. 二叉树的最大深度—leetcode104
  4. 用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!
  5. OsharpNS轻量级.net core快速开发框架简明入门教程
  6. vscode私钥设置_VSCode远程开发配置指南
  7. JVM系列五:JVM监测工具[整理中]
  8. TensorFlow第十步CNN BP 编程求解
  9. javascript浮点数学习总结之0.1+0.2
  10. java oracle 换行,oracle中Clob字段中的回车换行在jsp中展示的问题
  11. mysql存储过程迭代自己获取所有子孙
  12. Messes in Reading Source Coding of SSD
  13. 啥?喝着阔落吃着西瓜就把Promise手写出来了???
  14. android框架揭秘之Java服务学习笔记
  15. 服务器pd接口不显示,服务器新盘无法识别(JBOD)
  16. 全国首个海洋大数据交易服务平台交易额破百万
  17. Java基本数据类型(范围 默认值 占用字节 精度
  18. 【liteOS】小白进阶之移植 LiteOS 到 STM32
  19. html中bak是什么文件怎么打开,bak文件怎么打开?小编教你bak文件打开方法
  20. 微信小程序中的本地存储

热门文章

  1. 矩阵的定义及其相关运算
  2. Scoop安装使用及卸载
  3. 遗传算法python(含例程代码与详解)
  4. SPI Flash Rom W25Q16 ----基于STC15
  5. scrapy框架,腾讯新闻爬取
  6. CSR8670项目实战:BluePager蓝牙寻呼机
  7. 《江城子》~ 程序员~
  8. bShare分享-分享到微信、微博、QQ
  9. 狂神springcloud速补笔记6
  10. Spring 事务事件监控及实现原理