[NOJ]数据结构实验2.4 稀疏矩阵的乘法

[NOJ]数据结构实验2.4 稀疏矩阵的乘法

在这里插入图片描述
在这里插入图片描述

		#include<stdio.h>
		#include<stdlib.h>
		
		typedef struct OLNode
		{
			int row,col;
			int value;
			struct OLNode *right,*down;
		}OLNode,*OLink;
		typedef struct
		{
			OLink *rhead,*chead;
			int m,n,len;
		}CrossList;
		
		void enter(CrossList *M,int i,int j,int e)   //将元素插入十字链表
		{
			OLink q;
			OLink p=(OLink)malloc(sizeof(OLNode));
			p->row=i;p->col=j;p->value=e;
			if(M->rhead[i]==NULL||M->rhead[i]->col>j){
				p->right=M->rhead[i];
				M->rhead[i]=p;
			}
			else{
				q=M->rhead[i];
				while(q->right&&q->right->col<j) q=q->right;
				p->right=q->right;
				q->right=p;
			}
			if(M->chead[j]==NULL||M->chead[j]->row>i){
				p->down=M->chead[j];
				M->chead[j]=p;
			}
			else{
				q=M->chead[j];
				while(q->down&&q->down->row<i) q=q->down;
				p->down=q->down;
				q->down=p;
			}
		}
		
		void init(CrossList *M)   //矩阵初始化
		{
			scanf("%d %d",&M->m,&M->n);
			M->rhead=(OLink*)malloc(sizeof(OLink)*(M->m+1));
			M->chead=(OLink*)malloc(sizeof(OLink)*(M->n+1));
			int i,j,e,k;
			OLink q;
			for(k=1;k<=M->m;k++) M->rhead[k]=NULL;
			for(k=1;k<=M->n;k++) M->chead[k]=NULL;
			for(scanf("%d %d %d",&i,&j,&e);i!=0;scanf("%d %d %d",&i,&j,&e))
			{
				enter(M,i,j,e);
			}
		}
		
		void mul(CrossList*A,CrossList*B,CrossList*C)   //矩阵相乘
		{
			C->rhead=(OLink*)malloc(sizeof(OLink)*(A->m+1));
			C->chead=(OLink*)malloc(sizeof(OLink)*(B->n+1));
			C->m=A->m;C->n=B->n;
			int i,j,e,k;
			OLink q,p;
			for(k=1;k<=C->m;k++) C->rhead[k]=NULL;
			for(k=1;k<=C->n;k++) C->chead[k]=NULL;
			for(i=1;i<=A->m;i++)
			{
				for(j=1;j<=B->n;j++)
				{
					e=0;
					p=A->rhead[i];
					q=B->chead[j];
					while(p&&q)
					{
						if(p->col==q->row)
						{
							e+=p->value*q->value;
							p=p->right;
							q=q->down;
						}
						else if(p->col<q->row) p=p->right;
						else q=q->down; 
					}
					if(e)
					{
						enter(C,i,j,e);
					}
					//printf("%d ",e);
				}	
			}
		}
		
		int main()
		{
			CrossList *A,*B,*C;
			A=(CrossList*)malloc(sizeof(CrossList));
			init(A);
			B=(CrossList*)malloc(sizeof(CrossList));
			init(B);
			C=(CrossList*)malloc(sizeof(CrossList));
			mul(A,B,C);
			OLink p;
			int i;
			for(i=1;i<=C->m;i++)    //结果输出
			{
				p=C->rhead[i];
				while(p)
				{
					printf("%d %d %d\n",p->row,p->col,p->value);
					p=p->right;
				}
			}
			return 0;
		}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值