稀疏矩阵

#include<stdio.h>
#include<iostream>
#include<malloc.h>
#include<stdlib.h>
typedef struct {
	int r;
	int c;
	int d;
}TupNode;//定义每个非零元素对应的三元数组
typedef struct {
	int rows;
	int cols;
	int nums;//非零元素个数
	TupNode data[100];
}TSMatrix;//三元组顺序表,用顺序表(每个元素是三元组)来存储稀疏矩阵
//创建
void CreatMat(TSMatrix &t, int A[M][N])
{
	int i, j;
	t.rows = M;
	t.cols = N;
	t.nums = 0;
	for (i = 0; i < M; i++)
	{
		for (j = 0; j < N; j++)
		{
			if (A[i][j] != 0)
			{
				t.data[t.nums++] = { i,j,A[i][j] };
				//t.data[t.nums].r=i;
				//t.data[t.nums].c=j;
				//t.data[t.nums].d=A[i][j];
				//t.nums++;
			}
		}
	}

}
//赋值
bool Value(TSMatrix &t, int x, int i, int j)
{
	if (i < 0 || i >= t.rows || j < 0 || j >= t.cols)
	{
		return false;
	}
	else
	{
		int m, q,k;
		/*for (m = 0; m < t.nums; m++)
		{
			//修改已有值
			if (t.data[m].r ==i&&t.data[m].c == j)

			{
				t.data[m].d = x;
				return true;
			}
			else if (t.data[m].r > i&&t.data[m].c > j)
			{
				for (k = t.nums; k >= (m + 1); k--)
				{
					t.data[k] = t.data[k - 1];
				}
				t.data[m] = { i,j,x };
				t.nums++;
				)

		}
		/*t.data[t.nums++] = { i,j,x };
		return true;*/
		k = 0;
		while (k<t.nums&&i>t.data[k].r)
			k++;
		while (k<t.nums&&i ==t.data[k].r&&j>t.data[k].c)k++;
		if (t.data[k].r == i&&t.data[k].c == j)

		{
			t.data[k].d = x;
		}
		else

		{

		}
	
	}
}
//将指定位置元素赋值给一个变量
bool Assign(TSMatrix t, int &X, int i, int j)
{
	if (i >= t.rows || j >= t.cols)
		return false;//超界了
	int k;
	/*for (k = 0; k < t.nums; k++)
	{
		//能找到说明是非零
		if (t.data[k].r == i&&t.data[k].c == j)
		{
			X = t.data[k].d;
			return true;
		}
		
		while()
	}*/
	//查找行
	while (k < t.nums&&i>t.data[k].r)
		k++;//一定是>=i,没有的话就是最近的大的
	while (k<t.nums&&i == t.data[k].r&& j>t.data[k].c)
		k++;
	if (t.data[k].r == i&&t.data[k].c == y)
	{
		X = t.data[k].d;
	}
	else
	{
		X = 0;
	}
	return true;
}
//输出
//转置
//粗糙的算法O(nt)
void Tran(TSMatrix t, TSMatrix &tb)
{
	int p, q = 0, v;
	tb.rows = t.cols;
	tb.cols = t.rows;
	tb.nums = t.nums;
	int k = 0;
	int p = 0;
	if (t.nums != 0)
	{
		for (p = 0; p < t.cols; p++)
		{
			for (q = 0; q < t.nums; q++)
			{
				if (t.data[q].c == p)
				{
					tb.data[k++] = t.data[q];
				}

			}
		}
	}
}
//十字链表表示稀疏矩阵

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值