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

news/2024/10/25 13:23:29/

十字链表矩阵相乘

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

  • 矩阵的输入

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

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

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

这个代码实在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;
}

感谢关注与支持


http://www.ppmy.cn/news/315268.html

相关文章

POJ1009:Edge Detection

问题 描述 IONU Satellite Imaging, Inc. records and stores very large images using run length encoding. You are to write a program that reads a compressed image, finds the edges in the image, as described below, and outputs another compressed image of the…

湖北师范大学计信学院C语言学期实训

目录 1.进制转换 1.1二进制转十进制 1.2十进制整数转二进制 1.3十进制小数转二进制

一个很牛的 linux shell脚本编写的俄罗斯方块游戏实例代码,非常牛逼

本文转载&#xff1a;https://www.qiansw.com/shell-tetris-game.html 可以将下面代码直接保存为sh文件。 #!/bin/bash # Tetris Game # 10.21.2003 xhchen< [email]xhchenwinbond.com.tw[/email]> #APP declaration APP_NAME"${0##*[\\/]}" APP_VERSIO…

全局拉普拉斯平滑之(1)Strucutre extraction from texture via relative total variation及稀疏矩阵求解

最近在研究图像增强处理过程中&#xff0c;阅读了关于全局拉普拉斯平滑&#xff08;global laplacian smoothing&#xff09;&#xff0c;加权最小二乘平滑&#xff08;weighted least squares --wls&#xff09;等技术文章&#xff0c;深感此类方法的精妙&#xff0c;并且这种…

问题 K: oop实习-11.运算符重载

题目描述 定义有理数类&#xff08;分母不为0的分数&#xff0c;分子分母均为整数&#xff09;Rational&#xff0c;实现相应操作符的重载。 &#xff08;1&#xff09;定义私有数据成员&#xff1a;分子int iUp; 分母 int iDown。 &#xff08;2&#xff09;定义私有成员函…

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

前言 此文章是本人第一篇博客&#xff0c;目的在于巩固过去所学的知识&#xff0c;同时可能会给大家带来一丝丝帮助&#xff0c;但由于没有经验加上本人能力极其有限&#xff0c;文章中可能存在不足之处&#xff0c;还请读者能够指正&#xff08;&#xff65;ω&#xff65;&a…

解决C++运算符重载时=和+(或-、*、/、后置自增自减)无法连用

背景题目&#xff1a; 定义有理数类&#xff08;分母不为0的分数&#xff0c;分子分母均为整数&#xff09;Rational&#xff0c;实现相应操作符的重 载。 &#xff08;1&#xff09;定义私有数据成员&#xff1a;分子int iUp; 分母 int iDown。 &#xff08;2&#xff09;定义…

shell脚本实现俄罗斯方块

脚本内容&#xff1a; #!/bin/bash # Tetris Game# 10.21.2003 xhchen< [email]xhchenwinbond.com.tw[/email]> #APP declarationAPP_NAME"${0##*[\\/]}"APP_VERSION"1.0" #颜色定义cRed1cGreen2cYellow3cBlue4cFuchsia5cCyan6cWhite7colorTable($c…