c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表稀疏矩阵的加法)

【数据结构】算法5.4 十字链表-创建 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stdarg.h>#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2typedef int Status; typede 阅读详情
/*
以下是用于测试的两个稀疏矩阵
   3  0  0  5                       
M= 0 -1  0  0  (M矩阵)            
   2  0  0  0

  -3  0  2  0                       
N= 0  5  0  0  (N矩阵)            
   0  0  0 -1      

M=M+N

   0  0  2  5                       
M= 0  4  0  0  (相加后的M矩阵)            
   2  0  0 -1      

以上是矩阵表示图

                 M.chead(colhead)           1          2         3        4
M.rhead(rowhead) 
1                                         1 1 3                         1 4 5(分别表示行列和该位置的值)

2                                                    2 2 -1

3                                         3 1 -2

                 N.chead(colhead)           1          2         3        4
N.rhead(rowhead) 
1                                         1 1 -3               1 3 2         

2                                                    2 2 5

3                                                                       3 4 -1           

M矩阵相加后
                 M.chead(colhead)           1          2         3        4
M.rhead(rowhead) 
1                                                              1 3 2    1 4 5    

2                                                    2 2 4

3                                         3 1 -2                        3 4 -1  

以上是三元表示形式 压缩的最后表现方式 忽略了矩阵中的零元
*/

#include<stdio.h>
#include<stdlib.h>
//宏定义

#define OK 1
#define ERROR 0
#define OVERFLOW -2


typedef int Status;
typedef struct OLNode               //替换一个结构体的名字
{
	int i,j,e;                      //矩阵三元组i代表行 j代表列 e代表当前位置的数据
	struct OLNode *right,*down;     //指针域 右指针 下指针
}OLNode,*OLink;                     //结构体的新名

typedef struct 
{
	OLink *rhead,*chead;            //行和列链表头指针由CreateSMatrix分配
	int mu,nu,tu;                   //稀疏矩阵的行数,列数和非零元的个数
}CrossList;

Status CreateMatrix_OL(CrossList *M);
Status AddSMatrix(CrossList *M,CrossList *N);


void main()
{
	CrossList M,N;
	int i;
	OLNode *p;
	printf("输入测试矩阵:\n");
	CreateMatrix_OL(&M);
	printf("输入测试矩阵:\n");
	CreateMatrix_OL(&N);
	AddSMatrix(&M,&N);
	printf("输出测试矩阵:\n");
	printf("M:\n---------------------\ni\tj\te\n---------------------\n");
	//printf("%d\n\n",M.rhead[2]->e);
	
	for (i=1;i<=M.nu;i++)
	{
		if (NULL!=M.chead[i])
		{
			p=M.chead[i];
			while (NULL!=p)
			{
				printf("%d\t%d\t%d\n",p->i,p->j,p->e);
				p=p->down;
			}
		}
	}
	getchar();
	getchar();
}

Status CreateMatrix_OL(CrossList *M)  //创建系数矩阵M,采用十字链表存储表示
{
     int m,n,t;      //定义矩阵的行,列,非零元的数量
     int i,j,e;      //定义中间变量
     OLNode *p,*q;       //定义中间变量  
   //  if(M)
     //{
       //  free(M);    //如果矩阵已经存在,那么释放矩阵
     //}
     scanf("%d%d%d",&m,&n,&t);  //输入矩阵的行列及非零元的数量
     M->mu=m;
     M->nu=n;
     M->tu=t;     //初始化矩阵的行列及非零元的数量
     if(!(M->rhead=(OLink*)malloc((m+1)*sizeof(OLink))))
     {
        exit(OVERFLOW);      //初始化矩阵的行链表            
     }
     if(!(M->chead=(OLink*)malloc((n+1)*sizeof(OLink))))
     {
         exit(OVERFLOW);     //初始化矩阵的列链表
     }
     for(i=1;i<=m;i++)
     {
         M->rhead[i]=NULL;   //初始化行
     }
     for(j=1;j<=n;j++)
     {
         M->chead[j]=NULL;   //初始化列
     }
     for(scanf("%d%d%d",&i,&j,&e);0!=i;scanf("%d%d%d",&i,&j,&e)) //输入三元组 直到行为0结束
     {
         if(!(p=(OLNode*)malloc(sizeof(OLNode))))
         {
             exit(OVERFLOW);                 //动态生成p
         }
         p->i=i;
         p->j=j;
         p->e=e;                             //初始化p
		 if(NULL==M->rhead[i]||M->rhead[i]->j>j)
		 {
			 p->right=M->rhead[i];
			 M->rhead[i]=p;
		 }
		 else
		 {
			 for(q=M->rhead[i];(q->right)&&q->j>j;q=q->right);
			 p->right=q->right;
			 q->right=p;
		 }                                          
		 if(NULL==M->chead[j]||M->chead[j]->i>i)
		 {
			 p->down=M->chead[j];
			 M->chead[j]=p;
		 }
		 else
		 {
			 for (q=M->chead[j];(q->down );q=q->down);
			 p->down=q->down;
			 q->down=p;
		 }
     }
	 return OK;
}

Status AddSMatrix(CrossList *M,CrossList *N)
{
	int i,j;
	OLNode *p,*q,*temp;
	if (M->mu!=N->mu||M->nu!=N->nu)
	{
		exit(OVERFLOW);
	}
	M->tu+=N->tu;
	for (i=1;i<=N->mu;i++)
	{
		p=N->rhead[i];
		while(NULL!=p)
		{
			if(NULL==M->rhead[p->i]||M->rhead[p->i]->j>p->j)
			{
				p->right=M->rhead[p->i];
				M->rhead[p->i]=p;
			}
			else if(M->rhead[p->i]->j<p->j)
			{
				for (q=M->rhead[p->i];(q->right)&&q->j<p->j;q=q->right);
				p->right=q->right;
				q->right=p;
			}
			if (NULL==M->chead[p->j]||M->chead[p->j]->i>p->i)
			{
				p->down=M->chead[p->j];
				M->chead[p->j]=p;
			}
			else if (M->chead[p->j]->i<p->i)
			{
				for (q=M->chead[p->j];(q->down)&&q->i<p->i;q=q->down);
				p->down=q->down;
				q->down=p;
			}
			else
			{
				M->chead[p->j]->e+=p->e;
				M->tu--;
				if (0==M->chead[p->j]->e)
				{
					M->tu--;
					M->chead[p->j]=M->chead[p->j]->down;
					M->rhead[p->i]=M->chead[p->j]->right;
				}
			}
			p=p->right;
		}
	}
	return OK;
}


 

 

数据结构——c语言描述 第五章(3)十字链表存储稀疏矩阵 数据结构笔记 阅读详情

相关推荐

数据结构——广义表和十字链表

1.广义表 概念:是线性表的推广,可以存储不同的数据结构,一般记为:LS=(a1,a2,...an);ai可以是单个元素也可以是广义表。 广义表的数据结构是用链结构来实现的。 几个特殊的广义表的长度:A=();长度为0,是个空表,D=((),(e),(a,(b,c,d)))是一个三元素的广义表 E=(a,E)=(a,(a,(a,.....)))是一个长度2的广义表。 A=(())的长度为

rqc112233的专栏 1428

十字链表表示矩阵c语言,十字链表法,十字链表压缩存储稀疏矩阵详解

对于压缩存储稀疏矩阵,无论是使用图 1 十字链表示意图可以看到,使用十字链表压缩存储稀疏矩阵时,矩阵中的各行各列都各用一各链表存储,与此同时,所有行链表的表头存储到一个数组(rhead),所有列链表的表头存储到另一个数组(chead)中。因此,各个链表中节点的结构应如图 2 所示:图 2 十字链表的节点结构两个指针域分别用于链接所在行的下一个元素以及所在列的下一个元素。链表中节点的 C 语言代码表...

weixin_29481259的博客 1281

Aurora 8B/10B IP核介绍 —— Xilinx 技术文档Pg046

一、概述该IP核与用户接口之间支持AXI4-Stream协议,且基于ZYNQ SOC、A7、K7、V7以及UltraScale、UltraScale+系列FPGA的高速收发器(the high-speed serial transceivers)进行实现。多达 16 个连续绑定4 个连续绑定的 GTP 收发器framingstreaming以及全双工或单工加扰消扰CRC校验热插拔Aurora 8B/10B核心(图1-1)是一种可扩展的、轻量级的、用于高速串行通信的链路层协议;

qq_32147275的博客 1640

稀疏矩阵的十字链表存储表示

typedef struct OLNode{      int  i,j;                 //该非零元的行列下标      ElemType    e;         struct  OLNode    *right  ,*down;      //该非零元所在行表、列表的后继链域 }  OLNode;   *OLink; typedef  struct {

wyx3613的专栏 558

Halcon-AOI外观缺陷检测系列

Halcon-AOI外观缺陷检测系列

Jumy_S的博客 1668

Rust 与 C/C++:Rust 比 C/C++ 更好还是只是“技能问题”?

对于许多嵌入式系统开发人员而言,的崛起似乎掀起了一股不小的浪潮,特别是在相较于传统的语言,Rust的“内存安全”优势让人眼前一亮。然而,是否可以将Rust作为C/C++的替代品?或者说,Rust是否真的比C/C++更好,抑或它只是一个“技能问题”呢?在嵌入式开发的领域,我观察到,尽管Rust在一些高性能、内存安全敏感的场景中受到了广泛推崇,但它在实际应用中的普及度,特别是在嵌入式领域,依然有限。今天,我会从多个角度探讨这个问题,并且分享一些对于Rust、C/C++以及嵌入式系统开发的个人见解。

qq_63315166的博客 1300

数据结构中的十字链表(1)

重新复习数据结构,十字链表主要在两个地方应用:稀疏矩阵的存储, 有向图的存储。稀疏矩阵,常用三元组存储,但是当矩阵的非零元素和位置在操作过程中变化较大时,就不一采用顺序结构存储了,此时十字链表就是不错的选择。下面是十字链表的数据结构,以及创建函数,篇幅有限没有帖内存释放的函数:typedef struct QLNode ...{    int iPos, jPos;        

dizuo的专栏 9278

Anomalies,Factors,andMultiFactorModels

转 Anomalies, Factors, and Multi-Factor Models 作者:石川,量信投资创始合伙人,清华大学学士、硕士,麻省理工学院博士;精通各种概率模型和统计方法,擅长不确定性随机系统的建模及优化。知乎专栏:https://zhuanlan.zhihu.com/mitcshi。未经授权,严禁转载。 摘要:本文解释了异象、因子以及多因子模型的区别和联系;梳理了从异象到因子再...

绿杨 794

【数据结构】十字链表的画法

有向边又称为弧假设顶点 v 指向 w,那么 w 称为弧头,v 称为弧尾顶点节点采用顺序存储顶点节点弧节点。

m0_52733659的博客 2659

Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机

使用FinalShell或Asbru远程连接虚拟机

howard2005的专栏 2279

基于 PCL 的工业盒体点云精准分割

本文提出一种基于PCL点云库的工业盒体点云分割算法,采用由粗到精的分层策略解决传统方法在噪声、稀疏和堆叠场景下的分割问题。算法通过区域生长粗分割、RANSAC平面筛选、球面回溯补全、凹包边界提取和圆柱回溯精分割五大核心模块,充分利用盒体几何先验特征,实现高效精准的分割效果。文章详细阐述了算法流程、参数调优指南及工程化要点,指出该方法相比深度学习具有速度快、鲁棒性强、部署简单的优势。同时分析了算法在倾斜、异形目标上的局限性,并展望了结合深度学习特征的混合模型发展方向。该算法为工业自动化场景中的3D视觉检测提供

weixin_45196569的博客 173

数据结构--数组和广义表--创建以十字链表为存储结构的矩阵

在链表中,每个非零元可以用含有5个yu

littlebeat123的专栏 1609

华为OD机试真题 新系统 2026-07-22 Java&Go&C 实现【最小代价完成论文评审】

某校有 n 篇论文需要分配给教师评审。 每篇论文 i 可由 files[i] 对应的教师列表中任一教师评审。 每篇论文至少需要一名教师评审。 每位教师 t 不论被分配多少篇论文,其评审费用固定为 cost[t]。 请给出参与评审教师数量最少时的总费用。 如果存在多种方案满足教师数量最少,则选择总费用最小的方案。

MISAYAONE的博客 153

稀疏矩阵的十字链表存储的思路

刚才终于完完全全、彻彻底底的搞明白了稀疏矩阵十字链表的存储方式的实现与该算法的思想。我觉得有必要把自己的思路记下来,一呢等自己将来忘记了可以回过头来看,二呢希望与我一样对该存储方式迷惑的朋友可以通过我的文章得到一点点的启示。现在进入正题。        我们知道稀疏矩阵的三元组

菜鸟的逆袭 5万+

YOLO11改进-模块-引入多尺度差异融合模块MDFM

MDFM主要用于融合双时相图像特征并生成带有丰富上下文信息的差异特征,其过程包含以下步骤:1. 特征提取与差异特征生成首先从双时相图像中提取特征f1和f2,然后将f1和f2进行像素级别的相减,再对相减结果取绝对值,最后通过一个3x3的卷积操作得到Di。2. 多尺度特征融合(MSFF)接着利用多尺度特征学习机制来增强特征融合效果。该机制通过不同核大小的卷积构建多尺度融合过程,具体是通过一个名为 MSFF 单元来实现的。

qq_64693987的博客 4380

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

稀疏矩阵十字链表

#include #include typedef struct Node { int i,j; double t;     struct Node *right, *down;            //删掉了struct }Node, *Link; typedef struct { Link *Rhead, *Chead; int row,col,num;

buzhidaowa的博客 1280

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C语言实现稀疏矩阵的十字链表存储

前两天在看课外的数据结构的书预习新知识的时候看到了一个特别有意思的稀疏矩阵问题,于是就按照书上的用C语言来实现之,刚学习数据结构的小白,请大佬们轻喷,下面上图: 下面是代码: #include<stdio.h>#include<stdlib.h> #define ElementType int typedef struct GNode *GList...

dongchang0182的博客 1324

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

11.十字链表 实现 稀疏矩阵 及 矩阵相加

#include #include FILE *fp; // 十字链表 实现 稀疏矩阵 及 矩阵相加 #define OK 0 #define ERROR 1 #define OVERFLOW 1 typedef bool Status; typedef char ElemType; typedef struct OLNode//节点信息 { int i, j; struct OLNo

我多么希望明天有太阳,来灼烧我腐烂的梦想 2674

十字链表c语言实验报告,矩阵加法(基于十字链表)及C语言代码实现

矩阵之间能够进行加法运算的前提条件是:各矩阵的行数和列数必须相等。在行数和列数都相等的情况下,矩阵相加的结果就是矩阵中对应位置的值相加所组成的矩阵,例如:采用链式存储结构存储稀疏矩阵三元组的方法,称为“十字。十字链表法表示矩阵例如,用十字链表法表示矩阵 A ,为:图2 矩阵用十字链表法表示由此可见,采用十字链表表示矩阵时,矩阵的每一行和每一个列都可以看作是一个单独的链表,而之所以能够表示矩阵,是因...

weixin_42131628的博客 1058

稀疏矩阵的加法(用十字链表实现A=A+B)

描述: 输入两个稀疏矩阵A和B,用十字链表实现A=A+B,输出它们相加的结果。 输入: 第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2,接下来的t1+t2行是三元组,分别是第一个矩阵的数据和第二个矩阵的数据, 三元组的第一个元素表示行,第二个元素表示列,第三个元素是该元素的值。 输出: 输出相加后的矩阵三元组。

comJason的博客 5853

c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)

/* 3 0 0 5 M= 0 -1 0 0 (M矩阵) 2 0 0 0 M.chead(colhead) 1 2 3 4 M.rhead(rowhead) 1 1 1 3

runner2012的专栏 3182

稀疏矩阵十字链表的储存形式(十字链表的创建与相加)

矩阵十字链表的储存形式(十字链表的创建与相加)#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;typedef struct node{ int i,j; int elem; struct node *right,*down;}cnode,*clink;typedef struct{...

碳酸钙的01妖精的博客 511

数据结构--十字链表(相加,创建)

// CrossList.cpp : Defines the entry point for the console application. /*-----CODE FOR FUN--------------- -------CREATED BY Dream_Whui------ -------2015-2-4-------------------*/ #include "stdafx.h"

Dream 1068

稀疏矩阵应用

稀疏矩阵的应用 此设计实现在三元组,十字链表下的稀疏矩阵的加、转、乘的实现。 1.稀疏矩阵的存储 2.稀疏矩阵的加法 3.矩阵乘法 4.矩阵转置              一:存储结构设计         采用三元组结构和十字链表结构存储稀疏矩阵的具体信息。其中:在三元组中,所有元素的信息用数组表示,每个数组元素中包含有行下标(i),列下标(j)和对应的数值(e),它们是整型数据

kxuan_z的专栏 5154

第五章(4)十字链表

提醒一句哦:从上一节开始,我用了C++编译器(因为此时刚好学了C++,尝一下鲜),所以在往函数中传递数据时,用了引用,而没有用指针。不过说真心话,这引用比指针真的真的方便了许多许多啊!!!强烈建议大家使用引用,我嘛,看心情,想用哪个就用哪个!呵呵……   //当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表//每个非零元可用一个含5个域的结点表示,其中除

风吹无迹雨落无痕 476
上一篇: c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)
下一篇: MFC与坦克大战系列(奇迹冬瓜)---chapter3(坦克属性定义与坦克的平滑移动)
utral董东东
博客等级 码龄16年 158粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值