[NOJ]数据结构 NO.13以十字链表为存储结构实现矩阵相加

[NOJ]数据结构 NO.13以十字链表为存储结构实现矩阵相加

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

		#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 init(CrossList *M,int m,int n,int t)    //矩阵A初始化
		{
			M->m=m;M->n=n;M->len=t;
			M->rhead=(OLink*)malloc(sizeof(OLink)*(m+1));
			M->chead=(OLink*)malloc(sizeof(OLink)*(n+1));
			int i,j,e,k;
			OLNode *q;
			for(i=1;i<=m;i++) M->rhead[i]=NULL;
			for(i=1;i<=n;i++) M->chead[i]=NULL;
			for(k=1;k<=t;k++)
			{
				OLNode* p=(OLNode*)malloc(sizeof(OLNode));
				scanf("%d %d %d",&i,&j,&e);
				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 add(CrossList *M,int t)   //矩阵相加
		{
			int i,j,e,k,flag=0;
			OLNode *q;
			for(k=1;k<=t;k++)
			{
				scanf("%d %d %d",&i,&j,&e);
				for(q=M->rhead[i];q;q=q->right)
				{
					if(q->col==j)
					{
						q->value+=e;
						flag=1;
						break;
					}
				}
				if(flag==0)
				{
					OLNode* p=(OLNode*)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;
					}
				}
				flag=0;
			}
		}
		
		int main()
		{
			CrossList *A;
			A=(CrossList*)malloc(sizeof(CrossList));
			int m,n,t1,t2;
			scanf("%d %d %d %d",&m,&n,&t1,&t2);
			init(A,m,n,t1);
			add(A,t2);
			int i;
			OLNode* p;
			for(i=1;i<=A->m;i++)
			{
				if(A->rhead[i]==NULL) continue;
				else
				{
					p=A->rhead[i];
					while(p)
					{
						if(p->value!=0)
						{
							printf("%d %d %d\n",p->row,p->col,p->value);
						} 
						p=p->right;
					}
				}
			}
			return 0; 
		}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值