精华内容
下载资源
问答
  • 数据结构实验稀疏矩阵
    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]

    更多相关内容
  • 程序可以对三元组的输入顺序加以限制,例如,按行优 数据结构实验稀疏矩阵计算器全文共11页,当前为第1页。先。注意研究教科书5.3.2节中的算法,以便提高计算效率。 数据结构实验稀疏矩阵计算器全文共11页,当前为...
  • 数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf数据结构实验稀疏矩阵计算器.pdf
  • 教育资料 实验报告 题目稀疏矩阵运算器 班级14电子商务平台建设班 完成日期2015.11.2 学号20141103468 姓名 孙少辉 学号20141103421 姓名 杨德龙 学号20141103407 姓名 柴益新 一需求分析 稀疏矩阵是指那些多数元素...
  • 数据结构第五次作业-数组运算 数据结构第五次作业-----数组的运算 实验目的 掌握稀疏矩阵的压缩存储方法及主要运算的实现 实验内容与要求 设计一个稀疏矩阵计算器要求能够 输入并建立稀疏矩阵 输出稀疏矩阵 执行两个...
  • 本题要求使用三元组进行矩阵转置,方法有两种,列序递增转置以及一次定位快速转置。 第一种方法思路简单,即将行列直接交换再进行排列,但占用空间较多,时间较慢。 第二种方法耗时较短,思路简述为记录每一列元素个...

    在这里插入图片描述
    在这里插入图片描述
    本题要求使用三元组进行矩阵转置,方法有两种,列序递增转置以及一次定位快速转置。
    第一种方法思路简单,即将行列直接交换再进行排列,但占用空间较多,时间较慢。
    第二种方法耗时较短,思路简述为记录每一列元素个数在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);
        }
    }
    
    展开全文
  • 矩阵转置没什么好说的,都在注释里了,上代码: #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;
    }
    
    
    展开全文
  • 数据结构实验报告 稀疏矩阵计算器。稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储(只存储非零元)和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。以“带行...
  • 西工大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;
    }

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

    展开全文
  • 完整的一套数据结构实验稀疏矩阵源码加完整的实验报告,可以供大家参考一下!
  • 数据结构课小实验,简单实现稀疏矩阵转置,终端显示 压缩包包含:xxjz.txt,一个cpp,可直接编译运行
  • 教学单位计算机科学与技术 学生学号_5 HUBEI ENGINEERING UNIVERSITY 数据结构 课程设计报告书 题 目稀疏矩阵运算器 学生 专业名称 指导教师 实验目的 深入研究数组的存储表示和实现技术熟悉广义表存储结构的特性 ...
  • 1、掌握各种特殊矩阵如对称矩阵、上、下三角矩阵和对角矩阵的压缩...掌握稀疏矩阵的各种存储结构以及基本运算实现算法。 2、掌握广义表的定义、存储结构和运算。 3、掌握递归算法的设计,递归算法到非递归算法的转换
  • 内蒙古科技大学 数据结构课程设计说明书 题 目稀疏矩阵运算器设计 学生姓名 学 号 专 业计算机科学与技术 班 级计 09-1 班 指导教师刘 月 峰 2011 年 6 月 24 日 稀疏矩阵运算器设计 摘 要 摘要设计一稀疏矩阵运算器...
  • 主要是稀疏矩阵的创建、输出、转置和快速转置 include.h #ifndef INCLUDE #define INCLUDE #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define OK 1...
  • 资源仅供参考!不用做其他用途 内含:完整实验报告代码,和注释
  • 西工大NOJ数据结构实验——实验 2.4稀疏矩阵的乘法
  • 编写程序,从字符文件读入三个正整数m, n, t以及t个三元组(i, j, e)建立稀疏矩阵的十字链表存储结构。其中,m、n分别表示矩阵行数和列数;i, j为非零元素行号和列号。编写算法,实现矩阵转置,输出转置后的三元组到...
  • 采用三元组表示稀疏矩阵,并实现基本运算的实验报告。
  • 数据结构:稀疏矩阵的基本操作】

    千次阅读 多人点赞 2019-11-30 14:15:19
    实验用C语言实现 稀疏矩阵:矩阵阶数很大,非零元个数较少,零元很多,但非零元的排列没有一定规律。 三元组表法:一种顺序存储(按行优先...2、设计稀疏矩阵的建立算法(数据从键盘输入) 如 0 0 0 0 3 0 0 1 2 ...
  • 实现A、B个数组相加,此矩阵放于第C个数组中,解决讲一个稀疏矩阵对应存于一个一维数组中,然后进行矩阵加法运算时依次扫描矩阵A和矩阵B的行列值,以行优先,当行列相同时,第三个元素值相加的和以及行列号三个元素...
  • 大学学数据结构一般都会接触到这个!!所以给大家分享下
  • 数据结构实验报告稀疏矩阵,实验报告的模式,稀疏矩阵的运用
  • [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
  • 数据结构与算法实验指导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 ...
  • 特殊矩阵、稀疏矩阵的表示实现与运算
  • 数据结构设计性试验--稀疏矩阵的基本操作(C编写) 内有源代码 可执行文件 实验报告

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,936
精华内容 6,774
关键字:

数据结构实验稀疏矩阵

数据结构 订阅
友情链接: 3实现幻灯片切换.rar