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

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

#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  ]
", 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("三元组为:
");
	t.print();

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

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



	
	return 0;


}

  

原文地址:https://www.cnblogs.com/xcr1234/p/4550379.html