稀疏矩阵的加法(用十字链表实现A=A+B)
描写叙述:
输入两个稀疏矩阵A和B,用十字链表实现A=A+B,输出它们相加的结果。
输入:
第一行输入四个正整数,各自是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2,接下来的t1+t2行是三元组,各自是第一个矩阵的数据和第二个矩阵的数据, 三元组的第一个元素表示行,第二个元素表示列,第三个元素是该元素的值。
输出:
输出相加后的矩阵三元组。
输入例子:
3 4 3 2
1 1 1
1 3 1
2 2 2
1 2 1
2 2 3
输出例子:
1 1 1
1 2 1
1 3 1
2 2 5
#include <stdio.h>
#include<stdlib.h> typedef struct OLNODE
{
int row,col;
int data;
struct OLNODE *right,*down;
} NODE,*LNODE; typedef struct CORSS
{
LNODE *rh,*ch;
int ra,ca,da;
} CROSS, *LCROSS; void Create(LCROSS A); void PlusToA(LCROSS A,LCROSS B); void PrintCross(LCROSS A); int main()
{
LCROSS A = (LCROSS)malloc(sizeof(CROSS));
LCROSS B = (LCROSS)malloc(sizeof(CROSS)); scanf("%d %d %d %d",&A->ra,&A->ca,&A->da,&B->da);
B->ra = A->ra;
B->ca = A->ca; Create(A);
Create(B);//" 3 4 0 5 创建时B有问题"
PlusToA(A,B);
PrintCross(A);
return 0;
} void Create(LCROSS M)
{
int i;
LNODE p,temp; M->rh = (LNODE *)malloc((M->ra+1)*sizeof(LNODE));
M->ch = (LNODE *)malloc((M->ca+1)*sizeof(LNODE)); for(i=1; i<=M->ra; i++)
{
M->rh[i]=NULL;
}
/*for(i=1; i<=M->ca; i++)
{
M->ch[i]=NULL;
}*/ if(M->da != 0)
{
for(i=1; i<=M->da; i++)
{
p=(LNODE)malloc(sizeof(NODE));
scanf("%d %d %d",&p->row,&p->col,&p->data);
if(M->rh[p->row] == NULL)
{
p->right=NULL;
M->rh[p->row] = p; }
else
{
for(temp=M->rh[p->row];; temp=temp->right)
{
if(temp->right == NULL)
{
temp->right = p;
p->right =NULL;
break;
}
else if(temp->col < p->col && temp->right->col>p->col)
{
p->right = temp->right;
temp->right = p;
break;
}
else if(temp==M->rh[p->row] && temp->col>p->col)
{
p->right = temp;
temp=p;
break;
}
} } /* if(M->ch[p->col] == NULL|| M->ch[p->col]->row>(p->row))
{ p->down=M->ch[p->col];
M->ch[p->col] = p;
}
else
{
for(temp=M->ch[p->col]; temp->down && temp->down->row<p->row; temp=temp->down); p->down = temp->down;
temp->down = p;
}*/
}
} } void PlusToA(LCROSS A,LCROSS B)
{
int i;
LNODE p,temp1,temp2;
for(i=1; i<=A->ra; i++)
{
if(B->rh[i] == NULL) continue;
else
{
if(A->rh[i] == NULL)
{ p=(LNODE)malloc(sizeof(NODE));
p->col = B->rh[i]->col;
p->row = B->rh[i]->row;
p->data = B->rh[i]->data;
A->rh[i]=p;
p->right = NULL;
B->rh[i]=B->rh[i]->right; }
if(B->rh[i]==NULL)continue;
for(temp1=B->rh[i];; temp1=temp1->right)
{
for(temp2=A->rh[i];; temp2=temp2->right)
{
if(temp2->col == temp1->col)
{
temp2->data+=temp1->data;
break;
}
else if(temp2==A->rh[i] && temp1->col<temp2->col)
{
p=(LNODE)malloc(sizeof(NODE));
p->col = temp1->col;
p->row = temp1->row;
p->data = temp1->data;
p->right = temp2->right;
p->right =temp2;
A->rh[i]=p;
break;
}
else if((temp2->right == NULL || temp2->right->col>temp1->col) && temp1->col>temp2->col)
{
p=(LNODE)malloc(sizeof(NODE));
p->col = temp1->col;
p->row = temp1->row;
p->data = temp1->data;
p->right = temp2->right;
temp2->right=p;
break;
} } if(temp1->right == NULL) break;
}
}
} } void PrintCross(LCROSS A)
{
int i;
LNODE p;
for(i=1; i<=A->ra; i++)
{
p=A->rh[i];
while(p!=NULL)
{
printf("%d %d %d\n",p->row,p->col,p->data);
p=p->right;
}
}
}
TIP:
1、仅使用了十字链表中的行链表,列链表被凝视掉了,由于本题中没用。
2、注意改动链表时一定要改动原链表变量!!
如,定义链表A。temp=A。改动temp=p不能达到改动链表A=p的目的。
稀疏矩阵的加法(用十字链表实现A=A+B)的更多相关文章
- 利用十字链表压缩稀疏矩阵(c++)-- 数据结构
题目: 7-1 稀疏矩阵 (30 分) 如果一个矩阵中,0元素占据了矩阵的大部分,那么这个矩阵称为“稀疏矩阵”.对于稀疏矩阵,传统的二维数组存储方式,会使用大量的内存来存储0,从而浪费大量内存.为 ...
- javascript实现数据结构:稀疏矩阵的十字链表存储表示
当矩阵的非零个数和位置在操作过程中变化大时,就不宜采用顺序存储结构来表示三元组的线性表.例如,在作“将矩阵B加到矩阵A上”的操作时,由于非零元的插入或删除将会引起A.data中元素的移动.为此,对这种 ...
- [game]十字链表的AOI算法实现
AOI主要有九宫格.灯塔和十字链表的算法实现.本文阐述十字链表的实现和尝试. 1. 基本原理 根据二维地图,将其分成x轴和y轴两个链表.如果是三维地图,则还需要维护多一个z轴的链表.将对象的坐标值按照 ...
- 稀疏矩阵乘法加法等的java实现
原创声明:本文系作者原创,转载请写明出处. 一.前言 前几天由于科研需要,一直在搞矩阵的稀疏表示的乘法,不过最近虽然把程序写出来了,还是无法处理大规模的矩阵(虽然已经是稀疏了).原因可能是 ...
- 十字链表 Codeforces Round #367 E Working routine
// 十字链表 Codeforces Round #367 E Working routine // 题意:给你一个矩阵,q次询问,每次交换两个子矩阵,问最后的矩阵 // 思路:暴力肯定不行.我们可以 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 图->存储结构->十字链表
文字描述 十字链表是有向图的另一种链式存储结构. 在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点.这些结点的结构如下所示: 在弧结点中有5个域: 尾域tailvex和头域h ...
- 数据结构之BF算法,kmp算法,三元组,十字链表总结
在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...
- 数据结构之---C++语言实现图的十字链表存储表示
近期一直忙着考研复习,非常久都没有更新博客了.今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstd ...
随机推荐
- WebSocket重连reconnecting-websocket.js的使用
原文:https://www.cnblogs.com/kennyliu/p/6477746.html 页面引用 <script src="~/Scripts/reconnectin ...
- 跟我一起学extjs5(08--自己定义菜单1)
跟我一起学extjs5(08--自己定义菜单1) 顶部和底部区域已经作好,在顶部区域有一个菜单的button.这一节我们设计一个菜单的数据结构,使其能够展示出不相同式的菜单.因为准备搭建的是一个系统模 ...
- SHA加密算法工具类
1.利用Apache的工具类实现加密: maven: <dependency> <groupId>commons-codec</groupId> <artif ...
- TFS WorkItem Permission Setting
TFS非常强大,但是权限设置确实非常的恶心复杂,这貌似是一切NB又傲慢的软件的通病. 那么,在哪里设置 WorkItem 的权限呢? 第一步: 第二步: 第三步,下面你将一目了然. 第四步,Share ...
- Objective-C:在类中设置不同协议
在下面的代码中,设置了两种不同的协议规则:一种是老师对学生设置的协议:即老师发出命令后,学生站起来.回答问题.坐下; 另一种是我对学生设置的协议:即学生按照我的协议中的初始化函数去初始化一个整数. / ...
- permission 文档 翻译 运行时权限
文档位置:API24/guide/topics/security/permissions.html System Permissions 系统权限 Android is a privilege-se ...
- [模仿微软Live.cn]JavaScript输入邮箱自动提示
原理是:在一个输入框 中,当我输入任何字的时候 自动下拉相应的邮箱提示,在输入框输入123的时候 下拉框有所有123的邮箱 输入其他的时候 有其他文案对应的邮箱. 同理 此插件不需要任何html标签, ...
- Android制作曲线、柱状图、饼形等图表——使用AChartEngine
之前在java开发中实现图表使用JFreeChar组件,最近有个小项目要求在Android端进行数据分析,如何实现图表呢?查了一下google提供了一个开源组件Achartengine非常好用,可实现 ...
- MongoDB学习笔记(一)--基础
Insert MongoD ...
- Web.config中加了system.diagnostics节点后就不能访问了
Web.config中加了system.diagnostics节点后就不能访问了,怎么回事? [解决方法] 不要把system.diagnostics节点作为web.config的第一个节点.