// 稀疏矩阵的三元组表示
#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;
}