十字链表矩阵相乘

  • 两个十字链表的矩阵相乘。

  • 矩阵的输入

    • 先需要输入矩阵的行数、列数、非0个数
    • 在输入非零数的坐标和数值

第一个矩阵:矩阵的显示比较粗糙,自己有需求自己改一下吧。

第二个矩阵:

结果:

  • 结果输出不是矩阵,自己需要可以自己改一下结果显示形式,我就这样显示了。

这个代码实在dev C++上实现的,这个看一下自己的环境,一般都没什么问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define ok 1
#define overflow 0
#define error -1
typedef int ElemType;
typedef int Status;
typedef struct OLNode
{int i,j;ElemType e;struct OLNode *right,*down;
}OLNode, *OLink;typedef struct{OLink *rhead,*chead;int mu,nu,tu;
}CrossList;
Status CreateSMatrix_OL(CrossList &M)
{int m,n,t,c=0;int i,j,e;int count;OLink p,q;printf("稀疏矩阵的行数、列数、非零元个数:\n");scanf("%d%d%d", &m, &n, &t);M.mu=m;M.nu=n;M.tu=t;if(m<1||n<1||t>m*n) {printf("该对象不符合矩阵要求");}else{if(!(M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))) exit(overflow);if(!(M.chead=(OLink *)malloc((n+1)*sizeof(OLink)))) exit(overflow);for(i=0;i<=m;i++) M.rhead[i]=NULL;for(j=0;j<=n;j++) M.chead[j]=NULL;printf("请依次输入元素行数、列数、权值:\n");for(count=0; count<t;count++){   c=count+1;printf("请输入第%d元素的关键信息:",c);scanf("%d%d%d", &i, &j, &e);if(!(p=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow);p->i=i; p->j=j; p->e=e;if(M.rhead[i]==NULL||M.rhead[i]->j>j) {p->right=M.rhead[i]; M.rhead[i]=p;}else{for(q=M.rhead[i];(q->right)&&(q->right->j<j);q=q->right);p->right=q->right; q->right=p;        //rhead是列数组 }if(M.chead[j]==NULL||M.chead[j]->i>i) {p->down=M.chead[j]; M.chead[j]=p;}else{for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down);p->down=q->down; q->down=p;          //chead是行数组 }}
}
return ok;
}
Status Initalization_OL(OLink &l)
{
if(!(l=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow);
}
Status Initalization_S(CrossList A,CrossList B,CrossList &M)//初始化矩阵c
{   int m,n;int i,j;M.mu=A.mu;m=A.mu;M.nu=B.nu;n=B.nu;if(!(M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))) exit(overflow);if(!(M.chead=(OLink *)malloc((n+1)*sizeof(OLink)))) exit(overflow);for(i=0;i<=m;i++) M.rhead[i]=NULL;for(i=0;i<=n;i++) M.chead[i]=NULL;return ok;
}Status CreateSMatrix(CrossList &M,OLink &l){   int i,j,e;OLink p,q;i=l->i;j=l->j;e=l->e;if(!(p=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow);p->i=i; p->j=j; p->e=e;p->down=NULL;p->right=NULL;if(M.rhead[i]==NULL||M.rhead[i]->j>j) {p->right=M.rhead[i]; M.rhead[i]=p;}else{for(q=M.rhead[i];(q->right)&&(q->right->j<j);q=q->right);p->right=q->right; q->right=p;        //rhead是列数组 }if(M.chead[j]==NULL||M.chead[j]->i>i) {p->down=M.chead[j]; M.chead[j]=p;}else{for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down);p->down=q->down; q->down=p;          //chead是行数组 }return ok;}int PrintSMatrix(CrossList M){int i,j;OLink p;if(M.mu<1||M.nu<1){printf("矩阵为空矩阵或者是非正常矩阵\n"); }else{for(j=1;j<=M.mu;j++){p=M.rhead[j];while(p){printf("第%d行%d列值为:%d\n",p->i,p->j,p->e);p=p->right;}}}return ok;}int MulA_B(CrossList A,CrossList B,CrossList &C)
{OLNode *q=NULL,*L=NULL;OLink S;int i,j,num;Initalization_OL(S);S->down=NULL;S->right=NULL;if(A.nu==B.mu){Initalization_S(A,B,C);for(i=1;i<=C.mu;i++)for(j=1;j<=C.nu;j++){num=0;q=A.rhead[i];L=B.chead[j];
while((q!=NULL)&&(L!=NULL))
{if(q->j==L->i){num+=q->e*L->e;
q=q->right;L=L->down;
}
else if(q->j>L->i){for(;L!=NULL;L=L->down){if(q->j<=L->i) break;}}else{for(;q!=NULL;q=q->right){if(q->j>=L->i) break;}}
}  printf("%d ",num); if(num!=0){S->i=i;S->j=j;S->e=num;CreateSMatrix(C,S);}else ;}}else{printf("\n矩阵无法相乘\n");}
}int main()
{CrossList A,B,C;OLink p,q,l;int data;printf("请依次输入第一个\n"); CreateSMatrix_OL(A);printf("\n该矩阵是%d*%d的矩阵\n",A.mu,A.nu);PrintSMatrix(A);printf("\n请依次输入第二个\n");CreateSMatrix_OL(B);printf("\n该矩阵是%d*%d的矩阵\n",B.mu,B.nu);PrintSMatrix(B);printf("\n矩阵相乘的结果:"); MulA_B(A,B,C);printf("\n该矩阵是%d*%d的矩阵\n",C.mu,C.nu);PrintSMatrix(C);printf("有用点个推荐呗!");system("pause");return 0;
}

感谢关注与支持

十字链表矩阵相乘代码实现--C语言相关推荐

  1. C++两个矩阵相乘代码(内附有矩阵相乘的条件与规则,以及对代码的详细解答)

    再复制粘贴代码之前可以先了解学习一下什么是矩阵相乘,矩阵相乘的条件与规则又是什么. 点击一下链接即可进入学习:                       #矩阵相乘的学习链接 以下是两个矩阵相乘的代 ...

  2. 单链表的基本操作代码实现(C语言版)

    目录 前言: 单链表的基本操作 准备工作(头文件.各种宏定义以及结构体定义) 一.较简单操作 1.单链表的初始化 2.判断单链表是否为空表 3.单链表的销毁 4.单链表的清空 5.求单链表的表长 二. ...

  3. pytorch统计矩阵非0的个数_矩阵的三种存储方式---三元组法 行逻辑链接法 十字链表法...

    在介绍矩阵的压缩存储前,我们需要明确一个概念:对于特殊矩阵,比如对称矩阵,稀疏矩阵,上(下)三角矩阵,在数据结构中相同的数据元素只存储一个. @[TOC] 三元组顺序表 稀疏矩阵由于其自身的稀疏特性, ...

  4. 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)

    特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...

  5. c++矩阵转置_python3 单行代码实现矩阵相乘

    Python中有许多模块用来进行科学与数学的运算. 例如,numpy就是其中的一个,而且numpy中就有大量.好使的矩阵乘法的函数. 即便如此,我们还是可以探究一下如何用Python的自带函数,在一行 ...

  6. 稀疏矩阵——实现三元组,十字链表下的稀疏矩阵的加、转、乘的

    稀疏矩阵应用: 实现三元组,十字链表下的稀疏矩阵的加.转.乘. 代码: #include<iostream> using namespace std; typedef int ElemTy ...

  7. 数据结构之图的存储结构:十字链表法

    图的存储结构:十字链表法 思维导图: 产生条件: 十字链表法的定义: 十字链表法的代码定义: 性能分析: 思维导图: 产生条件: 当用邻接矩阵存储时:空间复杂度为O(|v|^2),太大 当用邻接表法存 ...

  8. C C++实现两矩阵相乘--模拟法

    目录 前言 数学中两矩阵怎么相乘? C/C++语言实现 运行结果 前言 11月左右大三找日常实习的时候,面试乱杀,但是笔试碰到了这个矩阵相乘的编程题有几次,可能脑瓜子晕,突然被绕来绕去写不出来,很无语 ...

  9. 特殊矩阵的压缩存储(详细版 通俗易懂 含c语言稀疏矩阵十字链表代码 )

    前言 此文章是本人第一篇博客,目的在于巩固过去所学的知识,同时可能会给大家带来一丝丝帮助,但由于没有经验加上本人能力极其有限,文章中可能存在不足之处,还请读者能够指正(`・ω・´). 这篇文章首先会介 ...

最新文章

  1. div溢出显示时用省略号结尾 .
  2. c#,将pdf文件转换成图片文件。
  3. Express请求处理-静态资源的处理
  4. Win下执行Swing程序的BAT文件 和 Linux下执行Swing程序的SH文件
  5. java lock代码写法_java Lock接口详解及实例代码
  6. 「零门槛多语言 Python/C/C# 通用思想学习系列」第一篇:经典HelloWorld
  7. c语言判断x的个位数是否为5,用C语言编程从键盘输入一个正整数,判断其个位数是否为5,若是5则输出“yes”,否则输出“no”...
  8. ARCGIS 10.2全套资源下载地址
  9. FlashFXP中文破解 指南
  10. win10系统怎么查看电脑配置,win10电脑配置查看
  11. Sphinx 基础教程
  12. 136 137 260只出现一次的数字【我亦无他唯手熟尔】
  13. 深圳市威视爱普手术示教系统
  14. 裁员潮?忍不住偷出阿里P8大舅哥整理的2022年春招内部面试题
  15. webapp期末作业-oneapp
  16. 简单演示程序序列号的破解
  17. 数学计算机软件课程,《数学软件》课程教学大纲.doc
  18. Windows操作系统+朝鲜红星+国产麒麟+红旗+渗透专用系统+Oracle专用+技术专栏【资源大合集】 | 寻找C站宝藏
  19. 地大计算机学院田甜,【学霸画像】第七十一期—记计算机学院2013级本科生詹才韬...
  20. 2021-08-14 《 生活大爆炸版石头剪刀布》P1328

热门文章

  1. 在Livemedia的基础上开发自己的流媒体客户端 V 0.01
  2. MediaStream 实现带摄像头捕捉的表情包制作器
  3. unittest框架用法
  4. linux bash安装教程,linux bash命令怎么用?win10 linux bash命令使用教程
  5. 【Linux/shell】bash命令和sh命令的区别(20210109)
  6. visdom API 方便使用查阅
  7. 终端天线—10.无线充线圈仿真
  8. 一半圆形闭合线圈,半径,通过电流,放在均匀磁场中,磁场方向与线圈平面平行,磁感应强度?
  9. Unix 之父的密码终于被破解咧
  10. 程序员是“短命”职业吗?年龄大了是不是没前途?