稀疏矩阵和三元组

唯一不同的大概是将指定位置的元素值赋给变量,自己想的,也对。
//稀疏矩阵的三元组表示
//三元组顺序表的数据类型
#define M 3
#define N 3
#define MaxSize 100
#include<stdio.h>
typedef int ElemType;
typedef struct{	//一个三元组类型 
	int r;
	int c;
	ElemType d;
}TupNode;
typedef struct{
	int rows;
	int cols;
	int nums;
	TupNode data[MaxSize];
}TSMatrix;  //三元组顺序表

//从一个二位稀疏矩阵创建其三元组表示
void CreatMat(TSMatrix &t,ElemType 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].r=i;t.data[t.nums].c=j;
				t.data[t.nums].d=A[i][j];t.nums++;
			}
		}
	}
} 

//三元组元素的赋值
bool Value(TSMatrix &t,ElemType x,int i,int j){
	int k=0,k1;
	if(i>=t.rows||j>=t.cols)
		return false;
	while(k<t.nums&&i>t.data[k].r)	k++;//t.data[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
	{
		for(k1=t.nums-1;k1>=k;k1--){
			t.data[k1+1].r=t.data[k1].r;
			t.data[k1+1].c=t.data[k1].c;
			t.data[k1+1].d=t.data[k1].d; 
		}	
	t.data[k].r=i;t.data[k].c=j; t.data[k].d=x;
	t.nums++;
	} 
}

//将指定位置的元素值赋给变量
bool Assign(TSMatrix t,ElemType &x,int i,int j){
	int a;
	if(i>=t.rows||j>=t.cols)
		return false;
	for(a=0;a<t.nums;a++){
		if(i==t.data[a].r&&j==t.data[a].c){
			x=t.data[a].d;
			return true;
		}
		else
			return false;		
	}
} 

//输出三元组
void DispMat(TSMatrix t){
	int i;
	printf("%d %d %d\n",t.rows,t.cols,t.nums);
	printf("-----------------------------\n");
	for(i=0;i<t.nums;i++){
	 printf("%d %d %d\n",t.data[i].r,t.data[i].c,t.data[i].d); 
	} 
} 
int main(){
	int a[3][3]={0,0,1,0,5,8,4,0,7};
	int i,j,x;
	TSMatrix t;
	CreatMat(t,a);
	for(i=0;i<t.nums;i++){
			printf("%d %d %d\n",t.data[i].r+1,t.data[i].c+1,t.data[i].d);
			
	} 
	Value(t,888,0,0);
	printf("\n");
	for(i=0;i<t.nums;i++){
			printf("第%d行 第%d列 元素为:%d\n",t.data[i].r+1,t.data[i].c+1,t.data[i].d);
			
	} 
	Assign(t,x,0,0);
	printf("%d\n",x);
	DispMat(t);
}

用三元组表示稀疏矩阵,在一定程度上节约了空间。
如果用一个二维数组存放,有随机读取的特性
用三元组后,随机读取的特性会消失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值