唯一不同的大概是将指定位置的元素值赋给变量,自己想的,也对。
//稀疏矩阵的三元组表示
//三元组顺序表的数据类型
#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);
}
用三元组表示稀疏矩阵,在一定程度上节约了空间。
如果用一个二维数组存放,有随机读取的特性
用三元组后,随机读取的特性会消失。