-
2021-05-21 16:35:47
《数据结构 课程设计》稀疏矩阵实验报告
目 录
一、概述1
二、 系统分析1
三、 概要设计1
(1)主界面的设计:2
(2)系数矩阵的存储2
(3)具体实现流程图:3
四、详细设计4
(2)稀疏矩阵的相加:5
五、 运行与测试8
六、 总结与心得8
参考文献9
源代码9
一、概述
稀疏矩阵的加法运算,既将稀疏矩阵A和B,他均为m行n列,分别以数组的形式存放在A和B中,实现A+B=C,将所得的结果存放在C数组中。
系统分析
稀疏矩阵的保存:以一位数组顺序存放非零元素的行号、列号和数值,行号为-1作为结束符。以三个一维数组存放一个系数矩阵中的一个非零元素,为零额元素则不保存。用一个二重循环来实现判断每个系数矩阵的非零元素是否为零,不为零,就将其行列下标和其值存入一维数组中
稀疏矩阵的相加:用循环来判断存储A何B稀疏矩阵的两个一维数组中的行列下标是否相等和其大小关系。若相等,则将两个一维数组的第三个元素的值相加存入新的数组C里,行列下标不变的存入进去;若A的列小于B的列,则将A的三个元素直接存入C中;若B的列小于A的列,则将B的三个元素村日C中;若A的行小于B的行,则将A的三个元素存入C中;若A的行大于B的行,则将B存入C中。
概要设计
(1)主界面的设计:
定义两个矩阵a= 0 0 3 0 0 0 0 0 b= 0 2 0 0 0 0 0 0
0 0 0 0 0 0 5 0 0 0 0 4 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0
0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0
定义两个数组A和B,用于存储矩阵a和矩阵b的值;定义一个数组C,用于存放数组A和数组B相加后的结果。
(2)系数矩阵的存储
用一维数组存放系数矩阵A如下:A[0]=0,A[1]=2, A[2]=3, A[3]=1, A[4]=6, A[5]=5, A[6]=3, A[7]=4, A[8]=7, A[9]=5, A[10]=1, A[11]=9, A[12]=-1。
用一维数组存放系数矩阵B如下:B[0]=0,B[1]=1,B[2]=2, B[3]=1,B[4]=3, B[5]=4, B[6]=2, B[7]=5, B[8]=6, B[9]=3, B[10]=4, B[11]=8, B[12]=4,B[13]=2,B[14]=1,B[15]=-1。
(3)具体实现流程图:
四、详细设计
(1)稀疏矩阵的转存:
void CreateMatrix(int A[m][n],int B[50]),这是一个将稀疏矩阵转存的函数,类似于顺序存储三元组表。在这个方法中,只要用一个二重循环来判断每个矩阵元素是否为零,若不为零,则将其行、列下标及其值存入到一维数组B中对应的元素。在定义函数的过程中,我们需要定义一个for循环,以完成行和列的转换及存储。在函数的末尾我们定义一个B[K]=-1,用于结束非零元素的存储。
算法如下:
void CreateMatrix(int A[m][n],int B[50])
{
int i,j,k=0;
for(i=0;i
for(j=0;j
if(A[i][j]!=0){
B[k]=i;k++;
B[k]=j;k++;
B[k]=A[i][j];k++;
}
B[k]=-1;
}
(2)稀疏矩阵的相加:
void MatrixAdd(int A[max],int B[max],int C[max]),这个函数用于实现数组A和数组B的相加,并将其相加的结果存入数组C。这个函数讨论了数组在相加的过程中的几种情况:
A数组和B数组的行相等且列相等,两者直接相加后存入数组C中。
if(A[i]==B[j])
{
if(A[i+1]==B[j+1])
{
C[k]=A[i];
C[k+1]=A[i+1];
C[k+2]=A[i+2]+B[j+2];
k=k+3;
i=i+3;
j=j+3;
}
}
b、A的列小于B的列,将A的三个元素直接存入C中
if(A[i+1]
更多相关内容 -
数据结构实验稀疏矩阵计算器.docx
2022-07-11 19:06:19程序可以对三元组的输入顺序加以限制,例如,按行优 数据结构实验稀疏矩阵计算器全文共11页,当前为第1页。先。注意研究教科书5.3.2节中的算法,以便提高计算效率。 数据结构实验稀疏矩阵计算器全文共11页,当前为... -
数据结构实验稀疏矩阵计算器.pdf
2022-05-18 02:25:10数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf -
数据结构实验稀疏矩阵计算器.doc
2019-12-31 15:10:39教育资料 实验报告 题目稀疏矩阵运算器 班级14电子商务平台建设班 完成日期2015.11.2 学号20141103468 姓名 孙少辉 学号20141103421 姓名 杨德龙 学号20141103407 姓名 柴益新 一需求分析 稀疏矩阵是指那些多数元素... -
数据结构稀疏矩阵_数据结构稀疏矩阵十字链表
2019-12-05 00:54:54数据结构第五次作业-数组运算 数据结构第五次作业-----数组的运算 实验目的 掌握稀疏矩阵的压缩存储方法及主要运算的实现 实验内容与要求 设计一个稀疏矩阵计算器要求能够 输入并建立稀疏矩阵 输出稀疏矩阵 执行两个... -
NOJ数据结构实验003——稀疏矩阵转置
2021-04-17 23:06:17本题要求使用三元组进行矩阵转置,方法有两种,列序递增转置以及一次定位快速转置。 第一种方法思路简单,即将行列直接交换再进行排列,但占用空间较多,时间较慢。 第二种方法耗时较短,思路简述为记录每一列元素个...
本题要求使用三元组进行矩阵转置,方法有两种,列序递增转置以及一次定位快速转置。
第一种方法思路简单,即将行列直接交换再进行排列,但占用空间较多,时间较慢。
第二种方法耗时较短,思路简述为记录每一列元素个数在num数组中,以及将各列元素第一次出现位置在position数组中,以此进行快速转置。
代码如下:#include <stdio.h> #include <stdlib.h> #define MAXSIZE 2000 typedef struct { int row, col;//非零元行数、列数 int data; //非零元数据 }Triple; typedef struct { Triple elem[MAXSIZE]; int row_m, col_n, len; //矩阵行、列、非零元个数 }TSMatrix; TSMatrix In, Out; //定义全局变量 void InitMatrix(TSMatrix *M, int m, int n); //初始化矩阵 void ScanMatrix(TSMatrix *M); //输入矩阵非零数据 void TransMatrix(TSMatrix *In, TSMatrix *Out); //转置矩阵 void PrintMatrix(TSMatrix *Out); //输出矩阵 int main() { int m, n; scanf("%d%d", &m, &n); InitMatrix(&In, m, n); ScanMatrix(&In); TransMatrix(&In, &Out); PrintMatrix(&Out); return 0; } void InitMatrix(TSMatrix *M, int m, int n) { //初始化矩阵 M->row_m = m; M->col_n = n; M->len = 0; } void ScanMatrix(TSMatrix *In) { //输入矩阵非零数据 int tmp_row, tmp_col, tmp_data; int i = 0; while(1) { scanf("%d", &tmp_row); getchar(); scanf("%d", &tmp_col); getchar(); scanf("%d", &tmp_data); if (tmp_row == 0 && tmp_col == 0 && tmp_data == 0) { break; } In->len++; In->elem[i].row = tmp_row; In->elem[i].col = tmp_col; In->elem[i].data = tmp_data; i++; } } void TransMatrix(TSMatrix *In, TSMatrix *Out) { //转置矩阵 int *num, *position, tmp_col, tmp_position; int tmp_col_n = In->col_n + 1; num = (int*) malloc (sizeof(int)*tmp_col_n); position = (int*) malloc (sizeof(int)*tmp_col_n); Out->row_m = In->col_n; Out->col_n = In->row_m; Out->len = In->len; for (int i = 0; i < In->col_n; i++) { //将num元素置零 num[i] = 0; } for (int i = 0; i < In->len; i++) { //记录矩阵In各列元素个数 num[In->elem[i].col]++; } position[0] = 0; for (int i = 1; i < In->col_n; i++) { //记录各列元素应放置在数组的位置 position[i] = position[i-1] + num[i-1]; } for (int i = 0; i < In->len; i++) { //开始转置 tmp_col = In->elem[i].col; tmp_position = position[tmp_col]; Out->elem[tmp_position].row = In->elem[i].col; Out->elem[tmp_position].col = In->elem[i].row; Out->elem[tmp_position].data = In->elem[i].data; position[tmp_col]++; } } void PrintMatrix(TSMatrix *Out) { //输出矩阵 for (int i = 0; i < Out->len; i++) { printf("%d %d %d\n", Out->elem[i].row, Out->elem[i].col, Out->elem[i].data); } }
-
西北工业大学noj数据结构实验003稀疏矩阵转置
2021-04-18 17:20:31矩阵转置没什么好说的,都在注释里了,上代码: #include<stdio.h> #include <stdlib.h> #define ok 1 #define error 0 #define max 1000 typedef struct { int hang; int lie; int data; }seq; void...
矩阵转置没什么好说的,都在注释里了,上代码:
#include<stdio.h> #include <stdlib.h> #define ok 1 #define error 0 #define max 1000 typedef struct { int hang; int lie; int data; }seq; void zhuanzhi(seq zzj[],int j)//矩阵转置,i个元素 { int i; for( i=0;i<j;i++) { int a; a=zzj[i].hang; zzj[i].hang=zzj[i].lie; zzj[i].lie=a;//行列互换 } for(int j=0;j<i-1;j++)//冒泡排序将转置矩阵按照行序排列 for(int m=0;m<i-1-j;m++) { if(zzj[m].hang>zzj[m+1].hang) { seq t; t=zzj[m],zzj[m]=zzj[m+1],zzj[m+1]=t; } } } void shuchu(seq zzj[],int j)//矩阵输出.j个元素 { for(int i=0;i<j;i++) { printf("%d ",zzj[i].hang); printf("%d ",zzj[i].lie); printf("%d ",zzj[i].data); printf("\n"); } } int main() { int m,n; scanf("%d",&m); scanf("%d",&n); seq zzj[m*n];//申请一个含有m*n个元素的数组 int i;//元素个数 for ( i=0;;i++)//输入数组 { int a,b,c; scanf("%d",&a); getchar(); scanf("%d",&b); getchar(); scanf("%d",&c); if(a==0&&b==0&&c==0) break; zzj[i].hang=a; zzj[i].lie=b; zzj[i].data=c; } zhuanzhi(zzj,i); shuchu(zzj,i); return 0; }
-
数据结构实验报告 稀疏矩阵计算器
2019-05-02 13:19:24数据结构实验报告 稀疏矩阵计算器。稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储(只存储非零元)和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。以“带行... -
西工大NOJ数据结构实验——2.1稀疏矩阵转置
2022-04-01 13:57:27西工大NOJ数据结构实验——2.1稀疏矩阵转置对稀疏矩阵进行转置操作,按照老师讲的,有两种办法。我用的是第一种最简单的,从上到下一行一行得走,虽然速度很慢,但是简单。
说实话这个题目很讨厌,我们定义的三元组里面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; }
实在不行的话,点个赞也可以哦。
-
数据结构实验稀疏矩阵源码加实验报告
2008-12-14 13:09:45完整的一套数据结构实验稀疏矩阵源码加完整的实验报告,可以供大家参考一下! -
数据结构课实验_稀疏矩阵转置.zip
2020-03-25 23:02:03数据结构课小实验,简单实现稀疏矩阵转置,终端显示 压缩包包含:xxjz.txt,一个cpp,可直接编译运行 -
数据结构实验报告稀疏矩阵运算.docx
2020-11-09 00:31:36教学单位计算机科学与技术 学生学号_5 HUBEI ENGINEERING UNIVERSITY 数据结构 课程设计报告书 题 目稀疏矩阵运算器 学生 专业名称 指导教师 实验目的 深入研究数组的存储表示和实现技术熟悉广义表存储结构的特性 ... -
数据结构数组稀疏矩阵及广义表、递归实验报告
2022-03-12 14:40:431、掌握各种特殊矩阵如对称矩阵、上、下三角矩阵和对角矩阵的压缩...掌握稀疏矩阵的各种存储结构以及基本运算实现算法。 2、掌握广义表的定义、存储结构和运算。 3、掌握递归算法的设计,递归算法到非递归算法的转换 -
数据结构----稀疏矩阵运算器课程设计_稀疏矩阵运算器实验报告
2020-10-14 23:22:00内蒙古科技大学 数据结构课程设计说明书 题 目稀疏矩阵运算器设计 学生姓名 学 号 专 业计算机科学与技术 班 级计 09-1 班 指导教师刘 月 峰 2011 年 6 月 24 日 稀疏矩阵运算器设计 摘 要 摘要设计一稀疏矩阵运算器... -
数据结构实验——稀疏矩阵
2020-12-05 21:51:35主要是稀疏矩阵的创建、输出、转置和快速转置 include.h #ifndef INCLUDE #define INCLUDE #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define OK 1... -
【西南交大数据结构实验】数据结构实验五 基于十字链表的稀疏矩阵转置
2022-05-25 16:50:34资源仅供参考!不用做其他用途 内含:完整实验报告代码,和注释 -
西工大NOJ数据结构实验——实验 2.4稀疏矩阵的乘法
2022-04-09 19:11:25西工大NOJ数据结构实验——实验 2.4稀疏矩阵的乘法 -
数据结构实验报告4-数组与广义表-基于十字链表的稀疏矩阵转置-实验内容及要求.docx
2019-07-06 20:45:49编写程序,从字符文件读入三个正整数m, n, t以及t个三元组(i, j, e)建立稀疏矩阵的十字链表存储结构。其中,m、n分别表示矩阵行数和列数;i, j为非零元素行号和列号。编写算法,实现矩阵转置,输出转置后的三元组到... -
稀疏矩阵的运算实验报告
2018-10-06 19:53:39采用三元组表示稀疏矩阵,并实现基本运算的实验报告。 -
【数据结构:稀疏矩阵的基本操作】
2019-11-30 14:15:19本实验用C语言实现 稀疏矩阵:矩阵阶数很大,非零元个数较少,零元很多,但非零元的排列没有一定规律。 三元组表法:一种顺序存储(按行优先...2、设计稀疏矩阵的建立算法(数据从键盘输入) 如 0 0 0 0 3 0 0 1 2 ... -
数据结构实验报告 稀疏矩阵加源码
2013-12-30 17:10:50实现A、B个数组相加,此矩阵放于第C个数组中,解决讲一个稀疏矩阵对应存于一个一维数组中,然后进行矩阵加法运算时依次扫描矩阵A和矩阵B的行列值,以行优先,当行列相同时,第三个元素值相加的和以及行列号三个元素... -
稀疏矩阵实验报告(大学数据结构实验)
2010-11-22 23:28:50大学学数据结构一般都会接触到这个!!所以给大家分享下 -
数据结构实验报告(稀疏矩阵)
2012-12-18 13:23:25数据结构实验报告稀疏矩阵,实验报告的模式,稀疏矩阵的运用 -
[NOJ]数据结构实验2.1 稀疏矩阵转置
2021-04-28 22:33:56[NOJ]数据结构实验2.1 稀疏矩阵转置 #include<stdio.h> #include<stdlib.h> typedef struct { int row,col; int e; }Triple; typedef struct { Triple *data; int m,n,len... -
数据结构实验报告稀疏矩阵运算.doc
2021-10-12 19:46:29数据结构实验报告稀疏矩阵运算.doc -
数据结构与算法 特殊矩阵和稀疏矩阵.doc
2020-01-17 01:44:34数据结构与算法实验指导V2017 常熟理工学院计算机科学与工程学院 PAGE 2 常熟理工学院 数据结构与算法实验指导与报告书 _2017-2018_学年 第_1_ 学期 专 业 物联网工程 实验名称 特殊矩阵和稀疏矩阵 实验地点 N6-210 ... -
数据结构实验2.4:稀疏矩阵乘法
2020-05-31 20:43:16//稀疏矩阵乘法(三元组) #include <stdio.h> #include <stdlib.h> #define max 200 typedef struct Triple{ int i,j;//i行j列 int e; }Triple; typedef struct TSMaTrix{ Triple elem[max]; int ... -
特殊矩阵、稀疏矩阵的表示实现与运算.docx
2021-01-23 13:52:10特殊矩阵、稀疏矩阵的表示实现与运算 -
数据结构设计性试验--稀疏矩阵的基本操作(C编写)
2011-10-31 18:38:40数据结构设计性试验--稀疏矩阵的基本操作(C编写) 内有源代码 可执行文件 实验报告