数据结构学习--稀疏矩阵的三元组表示

// 稀疏矩阵的三元组表示

#include <stdio.h>

#define M 6
#define N 7
#define MaxSize M*N
typedef int ElemType;
struct TupNode
{

	int i, j;
	ElemType data;

};

class TSMatrix
{
private:
	int rows, cols, nums;
	struct TupNode data[MaxSize];
public:

	TSMatrix(ElemType A[M][N]);
	TSMatrix(const TSMatrix &other);
	TSMatrix()
	{
		nums = 0;
	}
	bool SetValue(int i, int j, ElemType x);
	bool GetValue(int i, int j, ElemType &x) const;
	void print() const;
	TSMatrix Trans() const; //转置

};

template <typename T>
void inline Swap(T &a, T &b)
{
	T tmp = a;
	a = b;
	b = tmp;
}

TSMatrix::TSMatrix(const TSMatrix &other)
{
	rows = other.rows;
	cols = other.cols;
	nums = other.nums;
	for (int i = 0; i<nums; i++)
	{
		data[i] = other.data[i];

	}

}

TSMatrix TSMatrix::Trans() const {  //求转置矩阵
	TSMatrix value;
	if (nums != 0){
		for (int k = 0; k<cols; k++)
		{
			for (int w = 0; w<nums; w++)
			{
				if (data[w].j == k)
				{
					value.data[value.nums].i = data[w].j;
					value.data[value.nums].j = data[w].i;
					value.data[value.nums].data = data[w].data;
					value.nums++;

				}

			}

		}
	}
	return value;
}

TSMatrix::TSMatrix(ElemType A[M][N]) //以二元数组构造稀疏矩阵
{
	rows = M;
	cols = N;
	nums = 0;
	for (int i = 0; i<M; i++)
	{
		for (int j = 0; j<N; j++)
		{
			if (A[i][j] != 0)
			{
				data[nums].i = i;
				data[nums].j = j;
				data[nums].data = A[i][j];
				nums++;

			}

		}

	}
}
void TSMatrix::print() const
//打印
{

	for (int i = 0; i<nums; i++)
	{
		printf("[  %d  |  %d  |  %d  ]\n", data[i].i, data[i].j, data[i].data);

	}

}

bool TSMatrix::SetValue(int i, int j, ElemType x)
{
	int  k, w;
	if (i >= rows || j >= cols) return false;
	if (x == 0) //有可能出现设定值为0的情况(删除)
	{
		for (k = 0; data[k].i<i || data[k].j<j&&k < nums; k++);
		if (data[k].i == i&&data[k].j == j)
		{
			//删除第k个元素
			nums--;
			for (w = k; w<nums; w++)
			{
				Swap(data[w], data[w + 1]);
			}
			return true;

		}
		else  //本来就是0了
		{
			return true;
		}

	}
	else
	{

		for (k = 0; data[k].i<i || data[k].j<j&&k < nums; k++);  //空循环直接查找待插入的位置

		if (data[k].i == i&&data[k].j == j)
		{
			data[k].data = x;
			return true;
		}
		else
		{
			data[nums].data = x;
			data[nums].i = i;
			data[nums].j = j;
			nums++;
			for (w = k; w<nums; w++)
			{
				Swap(data[w], data[k]);
			}
			return true;

		}

	}

}

bool TSMatrix::GetValue(int i, int j, ElemType &x) const
{
	int k;

	if (i >= rows&&j >= cols) return false;
	for (k = 0; k<rows&&data[k].i<i || data[k].j<j; k++);
	if (data[k].i == i&&data[k].j == j)
	{
		x = data[k].data;

	}
	else {
		x = 0;

	}

	return true;

}

int main()
{

	ElemType A[M][N] =
	{
		{ 0, 0, 1, 0, 0, 0, 0 },
		{ 0, 2, 0, 0, 0, 0, 0 },
		{ 3, 0, 0, 0, 4, 0, 0 },
		{ 0, 0, 0, 5, 0, 0, 0 },
		{ 0, 0, 0, 0, 6, 0, 0 },
		{ 0, 0, 0, 0, 0, 7, 4 }
	};
	TSMatrix t = A;

	printf("三元组为:\n");
	t.print();

	printf("设定2,0,1;2,3,9之后三元组为:\n");
	t.SetValue(2, 0, 1);
	t.SetValue(2, 3, 9);
	t.print();
	printf("设定5,5,0;5,6,0之后三元组为:\n");
	t.SetValue(5, 5, 0);
	t.SetValue(5, 6, 0);
	t.print();

	ElemType x;
	if (t.GetValue(2, 4, x)) printf("[2,4]=%d\n", x);
	if (t.GetValue(1, 7, x)) printf("[1,7]=%d\n", x);
	printf("转置矩阵三元组为:\n");
	t.Trans().print();

	return 0;

}

  

时间: 2024-10-05 04:26:00

数据结构学习--稀疏矩阵的三元组表示的相关文章

数据结构之自建算法库——稀疏矩阵的三元组表示

本文针对数据结构基础系列网络课程(5):数组与广义表中第3课时稀疏矩阵的三元组表示. 稀疏矩阵的三元组表示相关的算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:tup.h,包含定义稀疏矩阵的三元组表示数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef TUP_H_INCLUDED #define TUP_H_INCLUDED #define M 6 #define N 7 #define MaxSize 100 //矩阵中非零元素最多个数 typedef int Ele

数据结构(二):线性表的使用原则以及链表的应用-稀疏矩阵的三元组表示

上一篇博文中主要总结线性表中的链式存储结构实现,比如单向链表.循环链表,还通过对比链表和顺序表的多项式的存储表示,说明链表的优点.可以参看上篇博文http://blog.csdn.net/lg1259156776/article/details/47018813 下面先对没有介绍的链表中的双链表进行介绍,并通过稀疏矩阵的三元组的链式结构来深入理解较为复杂的链表存储结构.最后对三次博文所讲述的内容进行梳理,以帮助在实际应用中选择最合适的存储结构:顺序表和链表,来组织实现自己的算法和功能. 双向链表

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

数据结构学习笔记——绪论

数据结构学习笔记——绪论 为了更贴切的描述一种数据结构,通常采用二元组表示:(对于一种数据结构其逻辑结构唯一) B=(D,R)其中,B是一种数据结构,它由数据元素的集合D和D上二元关系的集合R所组成.即D={ di | 1 <= i<= n, n > 0}R={ rj | 1 <= j<= n, n > 0}D 上的一个关系r是序偶的集合,对于r中任一序偶<x,y>(x,y属于集合D),把x叫做偶序第一节点,把y叫做偶序第二结点,又称序偶的第 一结点为第二结

稀疏矩阵的三元组顺序表的C语言实现

对于没有排序功能的集合来说,都可以使用java.util.Collections.sort()方法进行排序,它除了集合对象以外,还需要提供一个比较器.如果列表中的元素全部都是相同的类型,并且这个类实现了Comparable接口,就可以简单的调用Collections.sort()方法,如果这个类没有实现comparable接口,那么可以创建一个比较器传递一个Comparator实例作为Sort()的第二个参数进行排序,另外,如果不想使用默认的分类顺序进行排序,同样也可以传递一个Comparato

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

数据结构学习日记2:实现一个简单的线性表功能(链式存储方式)

数据结构学习日记,此次是用链表来实现一个线性表的功能 // ListTable1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; #define ERROR 0; #define OK 1; typedef int Status; typedef int ElemType; //声明一个节点 typedef struct Node { ElemType d

数据结构学习之二叉排序树

介绍:二叉排序树是以一定的规则排列树中元素,因而可以进行快速的排序和查询的树状数据结构,一般规则是:对于树中任意一个节点,左孩子严格小于根,根严格小于右孩子,有点像大根堆.(只是大根堆中左右孩子关系并不确定,且和根的关系是统一的,而且有上浮和下沉操作使得大根堆总是一棵完全二叉树,其不断弹出堆顶形成有序列的过程叫做堆排序.虽然二叉排序树中也有旋转操作使得树尽量平衡,但是由于数值大小分明的左右孩子,在进行平衡操作时远不如大根堆方便快捷.)对于一棵已经构造完成的排序二叉树,它的中序遍历序列即为升序排列