25-数据结构-稀疏矩阵-三元组

简介:三元组,意思是一个结构体里,有三个变量,存储矩阵信息。而三元组顺序存储,则是用顺序表,存储三元组,里面包含,三元组类型的一维数组,存储非零元素;总的行数和列数。总的非零元素数,其中三元组类型的一维数组中第一个位置,存储总行数和总列数以及总的非零元素数。

思路:

  1. 定义三元组,用来表示一个格子的信息,该格子信息包含,它的行和列的位置,以及元素值,
  2. 定义一个三元组顺序表,里面有一个三元组类型的一维数组,用来存储非零元素,其中该数组第一个位置,存储总的行数和列数以及总的非零元素个数。
  3. 随后我们直接赋值一个二维数组稀疏矩阵,然后给该数组存进三元组顺序表中。
  4. 存的时候,我们需要对二维数组,进行遍历,检测到非零元素的时候,给三元组顺序表中的一维数组进行赋值,给对应的行数,列数,元素值赋值过去。此外非零元素个数++;
  5. 具体看代码就懂了。

代码如下:

复制代码
#include <stdio.h>
#define Max 36
#include <malloc.h>
//创建三元组
typedef struct Triples//这个为三元组表示,表示一个格子的内容,记录了改格子的坐标和值 
{
	int hang,lie;
	int val;//坐标下的值	
}Triples;
//三元组顺序存储
typedef struct TriplesList
{
	Triples *data;//给每个三元组格子,用顺序表表示。 
	int hangs,lies;            //总列数和行数 
	int count;//总的非零元素个数 
	
}TriplesList; 
//打印稀疏矩阵
void PrintNozero(int data[6][6],int hang,int lie)
{
	int i,j,count;
	for(i=0;i<hang;i++)
	{
		for(j=0;j<lie;j++)
		{
			printf("%d ",data[i][j]);
		}
		printf("\n");
	}

}
//初始化三元组一维数组
void InitTriplesList(TriplesList *t)
{
	t->data=(Triples*)malloc(sizeof(Triples)*100);
	t->count=0;
	t->hangs=0;
	t->lies=0;
}
//创建三元组顺序表,并检测稀疏矩阵非零元素信息,存进顺序表
void CreatTriplesList(TriplesList *t,int a[6][6],int hang,int lie)
{
	t->hangs=hang;
	t->lies=lie; 
	int i,j,k=1;
	t->data[0].hang=t->hangs; 
	t->data[0].lie=t->lies;
	
	for(i=0;i<hang;i++)
	{
		for(j=0;j<lie;j++)
		{
			if(a[i][j]!=0) //检测到非零,存进去。 
			{	t->count++;//给非零元素存储在三元组顺序表中 
				t->data[k].val=a[i][j];
				t->data[k].hang=i;
				t->data[k].lie=j;
				k=k+1;		
			}			
		}
	}
	t->data[0].val=t->count;
}
//打印三元组
void PrintTripelsList(TriplesList t)
{	
	int i;
	printf("非零元素分别在\n");
	for(i=0;i<=t.count;i++)
	{
		if(i==0)
		printf("此稀疏矩阵共%d行%d列,非零元素为%d个\n",t.data[i].hang,t.data[i].lie,t.data[i].val);
		else
		printf("%d行%d列为%d\n",t.data[i].hang,t.data[i].lie,t.data[i].val);
	}
	printf("\n");
} 

int main()
{
	int data[6][6]={0,0,-3,0,0,15,
				12,0,0,0,18,0,
				9,0,0,24,0,0,
				0,0,0,0,0,-7,
				0,0,0,0,0,0,
				0,0,14,0,0,0};
//打印稀疏矩阵
	PrintNozero(data,6,6);
//创建三元组顺序表
	TriplesList t;
//初始化顺序表
	InitTriplesList(&t);
//给三元组顺序表赋值
	CreatTriplesList(&t,data,6,6); 
//打印
	PrintTripelsList(t);
	return 0;
}
相关推荐
mwq301231 分钟前
TencentOS Server 4 部署 Coze Studio 完整指南
人工智能
IT_陈寒8 分钟前
一文搞懂JavaScript的核心概念
前端·人工智能·后端
IT_陈寒9 分钟前
Java开发者必看!5个提升开发效率的隐藏技巧,你用过几个?
前端·人工智能·后端
做cv的小昊36 分钟前
结合代码读3DGS论文(10)——ICLR 2025 3DGS加速&压缩新工作Sort-Free 3DGS论文及代码解读
论文阅读·人工智能·游戏·计算机视觉·3d·图形渲染·3dgs
机器之心41 分钟前
龙虾之后,为什么说「主动式智能」才是Agent的终极形态?
人工智能·openai
智算菩萨1 小时前
GPT-5.4 Pro与Thinking模型全面研究报告
人工智能·gpt·ai·chatgpt·ai-native
团子和二花1 小时前
openclaw平替之nanobot源码解析(八):Gateway进阶——定时任务与心跳机制
人工智能·gateway
机器之心1 小时前
昨晚,OpenClaw大更新,亲手终结「旧插件」时代
人工智能·openai
码路高手1 小时前
Trae-Agent源码重点
人工智能·架构
剑穗挂着新流苏3121 小时前
114_PyTorch 进阶:模型保存与读取的两大方式及“陷阱”避坑指南
人工智能·pytorch·深度学习