三元组操作(相加)——稀疏矩阵(c语言)

这篇具有很好参考价值的文章主要介绍了三元组操作(相加)——稀疏矩阵(c语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 运行环境:TDM-GCC

三元组用来存储稀疏矩阵比较节省空间,因为稀疏矩阵大部分都是零元素,而三元组只记录非零元素。

#include "stdio.h"
#define MaxSize 100
typedef int ElemType; 
//定义三元组线性表中的数据元素存储结构
typedef struct{
	int row;    //行号 
	int col;    //列号 
	ElemType d; //元素值,ElemType为数据元素类型学
}TripleNode;  //三元组定义

//定义三元组线性表存储结构
typedef struct{
	int rows;  //行数值 
	int cols;  //列数值 
	int nums;  //非零元素个数 
	TripleNode data[MaxSize]; //data 数据域 
}TMatrix;//三元组顺序表定义 

//以行序方式扫描二维矩阵A,将其非零的元素加入到三元组t
//以3行4列的稀疏矩阵为例
void CreatMat(TMatrix *t,int arr[3][4]) 
{
	int i;
	int j;
	t->rows = 3;
	t->cols = 4;
	t->nums = 0;
	//扫描矩阵中的非零元素
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			//只存非零值,以三元组方式
			if(arr[i][j]!= 0)
			{
				t->data[t->nums].row = i;
				t->data[t->nums].col = j;
				t->data[t->nums].d = arr[i][j];
				t->nums++; 
			 } 
		}
	} 
}
//获取i,j位置的元素的值 ,赋值给data  执行 *data= A[i][j]
void MatrixGet(TMatrix *t,int *data,int i,int j){
	int k = 0;
	int k1;
	//指定的行或列是否合法
	if(i>=t->rows || j>= t->cols)
	return;
	while(k<t->nums && i>t->data[k].row)
	k++;
	while(k<t->nums && i==t->data[k].row && j>t->data[k].col)
	k++;
	if(t->data[k].row == i && t->data[k].col)
	{
		*data = t->data[k].d; //获取到值 
	}
	else{
		*data = 0;   //获取到值 
	}	 
}
//修改三元组元素中的值:执行A[i][j]= data
void MatrixSet(TMatrix *t,int data,int i,int j){
	int k = 0;
	int k1;
	if(i>=t->rows || j>=t->cols) 
	return;
	while(k<t->nums&&i>t->data[k].row)
	k++;
	while(k<t->nums&&i==t->data[k].row &&i>t->data[k].col)
	k++;
	//当找到指定位置时直接修改
	if(i==t->data[k].row && j==t->data[k].col) 
	{
		t->data[k].d=data; 
	}else
	{
		//如果指定位置不存在,则说明该元素值为0,此时插入
		for(k1=t->nums;k1>=k;k1--)
		{
			t->data[k1+1].col = t->data[k1].col; //后一个等于前一个,腾出一个位置给目标元素 
			t->data[k1+1].row = t->data[k1].row;
			t->data[k1+1].d = t->data[k1].d; 
		}
		//插入数据
		t->data[k].row = i;
		t->data[k].col = j;
		t->data[k].d = data;
		t->nums++; 
	}
	 
}

void MatrixAdd(TMatrix *A,TMatrix *B,TMatrix *C){
	int p =1;
	int q =1; 
	int k = 1;
	while(p<=A->nums && q<=B->nums){          //p 和 q 分别为 A 和 B 的非零元素个数 ,从1开始 
		if(A->data[p].row<B->data[q].row){    //如果A的第p元素的行号 小于 B的第q元素的行号
			C->data[k].row = A->data[p].row;  //C的第k个元素  就等于这个A 该元素。  即把A该元素(数据、行号、列号) 赋值给C 
			C->data[k].col = A->data[p].col;
			C->data[k].d = A->data[p].d;
			p++;                            //A当前p 已经完成,下一个元素 
			k++;                            //K 下一个位置 
		}else if(A->data[p].row == B->data[q].row){   //如果某元素的行数相等 ,那进一步看列 
		
			if(A->data[p].col<B->data[q].col){     //A的该元素的列 小于  B的元素的列           //C需要保留这个位置 
				C->data[k].d = A->data[p].d;       //把A的该元素(数据、行号、列号) 赋值给C        
				C->data[k].row = A->data[p].row;
				C->data[k].col = A->data[p].col;
				p++;                               //A的下一个 
				k++;                                 
			}else if(A->data[p].col == B->data[q].col){  //A的该元素的列 等于  B的元素的列           //这个时候需要相加元素的值 
				C->data[k].d = A->data[p].d + B->data[q].d;
				C->data[k].row = A->data[p].row;
				C->data[k].col = A->data[p].col;
				p++;
				k++;
				q++;
			}else{
				C->data[k].row = B->data[q].row;
				C->data[k].col = B->data[q].col;
				C->data[k].d = B->data[q].d;
				q++;
				k++;	 
			}
		}
		else{
			C->data[k].d = B->data[q].d;
			C->data[k].row = B->data[q].row;
			C->data[k].col = B->data[q].col; 
			q++;
			k++; 
		}
	}
	while(p<=A->nums){      //p没有进行完,说明A里面还有元素,直接弄到C里面就好 
		C->data[k] = A->data[p];
		p++;
		k++; 
	} 
	while(q<=B->nums){      //q没有进行完,说明B里面还有元素,直接弄到C里面就好 
		C->data[k] = B->data[q];
		q++;
		k++;
	}
	C->nums = k-1;
	C->cols = A->cols;  // 两个矩阵 同型  
	C->rows = A->rows; 
} 

//输出元素值
void DispMat(TMatrix *t){
	int i;
	if(t->nums <=0)
	{
		return;
	}
	printf("\n\t行数:%d\t列数:%d\t元素个数:%d\n",t->rows,t->cols,t->nums);
	printf("\t--------------------\n");
	//输出所有的三元组
	for(i=0;i<t->nums;i++)
	{
		printf("\t第%d 行\t第%d 列\t%d\n",t->data[i].row,t->data[i].col,t->data[i].d);
	 } 
} 


int main(void)
{
    //通过自定义3行4列的二维数组来表示稀疏矩阵
    int arrA[3][4] = {
                    {0 , 1 , 0 , 0},
                    {0 , 0 , 0 , 2},
                    {3 , 0 , 0 , 4}
                    };
    int arrB[3][4] = {
                {1 , 0 , 2 , 2},
                {0 , 0 , 3 , 2},
                {3 , 0 , 7 , 4}
                };

    int data = 0;
    TMatrix ta = {0};
    TMatrix tb = {0};
    TMatrix tc = {0};
    CreatMat(&ta , arrA);
    CreatMat(&tb , arrB);
    //输出三元组
    DispMat(&ta);
    DispMat(&tb);
    DispMat(&tc);
    MatrixAdd(&ta , &tb , &tc);
    //输出三元组
    printf("\n______________________________________\n");
    DispMat(&tc);
    return 0;
}

这里两个相加的矩阵有着同样的 i行 j列。

运行结果:


        行数:3 列数:4  元素个数:4
        --------------------
        第0 行  第1 列  1
        第1 行  第3 列  2
        第2 行  第0 列  3
        第2 行  第3 列  4

        行数:3 列数:4  元素个数:8
        --------------------
        第0 行  第0 列  1
        第0 行  第2 列  2
        第0 行  第3 列  2
        第1 行  第2 列  3
        第1 行  第3 列  2
        第2 行  第0 列  3
        第2 行  第2 列  7
        第2 行  第3 列  4

______________________________________

        行数:3 列数:4  元素个数:8
        --------------------
        第0 行  第0 列  0
        第0 行  第2 列  2
        第0 行  第3 列  2
        第1 行  第2 列  3
        第1 行  第3 列  4
        第2 行  第0 列  6
        第2 行  第2 列  7
        第2 行  第3 列  8

--------------------------------文章来源地址https://www.toymoban.com/news/detail-743399.html

到了这里,关于三元组操作(相加)——稀疏矩阵(c语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构·练习·三元组表法实现稀疏矩阵的转置

    一、问题描述 一个mxn的矩阵A,它的转置矩阵B是一个nxm矩阵,且A[i][j]=B[j][i],0=i=m-1,0=j=n-1,即A的行是B的列,A的列是B的行。 用三元组表对稀疏矩阵进行压缩存储,再进行时间复杂度O(n)的快速转置,最后输出稀疏矩阵。 其中m=4,n=5 二、算法概述 1、问题分析 1)压缩 2)转置

    2024年02月04日
    浏览(44)
  • 【数据结构】数组和字符串(四):特殊矩阵的压缩存储:稀疏矩阵——三元组表

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月05日
    浏览(44)
  • 稀疏矩阵的三元组表示----(算法详解)

    目录 基本算法包括:(解释都在代码里) 1.创建 2.对三元组元素赋值 3.将三元组元素赋值给变量 4.输出三元组 5.转置(附加的有兴趣可以看看) 稀疏矩阵的概念:矩阵的非零元素相较零元素非常小时,这个矩阵就叫稀疏矩阵。 稀疏矩阵可以用 三元组表示 和 十字链表表示

    2024年01月21日
    浏览(39)
  • 【C 数据结构】以三元组表形式表示稀疏矩阵,实现两个矩阵的加法、减法

    目的:以三元组表形式表示稀疏矩阵,实现两个矩阵的加法、减法。 实验步骤 1. 定义三元组存储结构 2. 输入稀疏矩阵:首先应输入矩阵的行数、列数和非零项的数目,并判别给出的两个矩阵的行、列数对于所要求进行的运算是否匹配。可设矩阵的行数和列数均不超过20。接

    2024年02月12日
    浏览(48)
  • 用三元组表实现稀疏矩阵的基本操作

    目录 问题描述 数据结构 算法设计 算法流程图  源代码  运行结果      ​    编写程序用三元组表实现稀疏矩阵的按列转置操作。 本设计使用三元组表实现。 程序中设计了三个函数: 1.函数InitSPNode()用来建立一个稀疏矩阵的三元组表。     首先输入行数、列数和非零元的

    2024年02月03日
    浏览(38)
  • 数据结构第七周 :(稀疏矩阵快速转置 + 简单文本编辑器 + 三元组的矩阵加法 + 九宫格数独游戏 + 数组主元素 + 螺旋数字矩阵 + 蛇形矩阵)

    【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。而矩阵转置就

    2023年04月21日
    浏览(42)
  • 稀疏矩阵的运算——矩阵相加

    南昌航空大学实验报告 课程名称:    数据结构A   实验名称:        实验五    稀疏矩阵运算        班   级:      XXX           学生姓名:       XXX         学号:      XXXXX       指导教师评定:       XXX     签    名:       XXX    

    2024年02月03日
    浏览(42)
  • 稀疏矩阵的加法和乘法(三元组)

    三元组方法: 主要的特点就是最后的结果矩阵均由三元组的形式来表达,调用函数再以矩阵形式输出 (1)稀疏矩阵加法 (下图参考懒猫老师《数据结构》课程相关笔记)  这里与普通矩阵加法不同的是,稀疏矩阵的三元组在加法计算时, 如果两个矩阵中的元素相加不为0时

    2024年01月17日
    浏览(46)
  • 稀疏矩阵的三元组存储及快速转置

    目录 问题描述  完整代码  详细分析 本节文章 【问题描述】 实现稀疏矩阵的三元组表存储和快速转置运算。 【输入形式】 输入一个整型的6阶稀疏矩阵。 【输出形式】 输出稀疏矩阵的三元组表形式,使用快速转置方法进行转置运算,输出辅助数组num和cpot的值及转置后的三

    2023年04月26日
    浏览(41)
  • 数据结构:三元组的构建、相加和快速转置

    目录 1.三元组表的定义 2.三元组表的数据结构 3.三元组表的构建 4.输出三元组表 5.两个三元组表相加  代码的流程图​  实现代码 6.三元组表的快速转置  算法思想  代码实现 7.三元组表输出矩阵 8.全部代码 9.总结         三元组研究目的 对于在实际问题中出现的大型的

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包