#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];
}
}
}
}
}
//十字链表表示稀疏矩阵
稀疏矩阵
最新推荐文章于 2022-11-17 21:51:17 发布